Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Добрый день.
Есть не индексированная вьюха V, в состав вьюхи входит таблица T и с колонкой даты MYDATE, индекс по колонке MYDATE есть I_MYDATE. Делаю запрос

SELECT *
FROM V
WHERE MYDATE = @dt


Смотрю план, если подхватился на первом шаге индекс I_MYDATE, запрос отрабатывает за 2-3 секунды, но часто оптимизатора берет не тот индекс и работает секунд 20. Как заставить оптимизатор брать всегда индекс I_MYDATE. Пишу хинт для вьюхи, оптимизатор его игнорит, почитал, видимо хинты можно делать только для индексированных вьюх. Как быть?
28 фев 13, 10:50    [13992590]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35376
Блог
ArtMan
но часто оптимизатора берет не тот индекс и работает секунд 20


и в этом случае вы выбираете почти всю таблицу?
28 фев 13, 10:54    [13992609]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Базовая таблица Т довольно БОЛЬШАЯ, каждый день прирастает на 10 000 строк, во вью около 15 таблиц. Есть стандартный способ заставить хинт взять нужный индекс?
P.S. Oracle легко понимает хинты для вьюх, проблем не было.
28 фев 13, 11:04    [13992670]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Glory
Member

Откуда:
Сообщений: 104751
ArtMan
Есть стандартный способ заставить хинт взять нужный индекс?

Хинт - это и есть способ. Хинта на принудительное использование хинта нет.
Есть еще Plan Guides

ArtMan
Смотрю план, если подхватился на первом шаге индекс I_MYDATE, запрос отрабатывает за 2-3 секунды, но часто оптимизатора берет не тот индекс и работает секунд 20.

И количество записей в результате запроса всегда одинаковое ?
И статистика обновляется ? И значения равномерно распределены ?
28 фев 13, 11:08    [13992695]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Пишу хинт для вьюхи, оптимизатор его игнорит

это как? хинт в запросе на выборку из вью, или хинт в самом вью?
28 фев 13, 11:17    [13992766]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Дайте, пожалуйста, пример, как заставить оптимизатор взять для вьюхи индекс I_MYDATE. Интересует хинт на выборку из вью. Только не надо ссылок на MSDN ))
28 фев 13, 11:28    [13992813]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
автор
И количество записей в результате запроса всегда одинаковое ?
И статистика обновляется ? И значения равномерно распределены ?


кол-во записей конечно одинаково, меняется план, а не запрос
статистика обновляется (день работает как надо, день не как надо)
про значения нет смысла говорить, вопрос - это часть задачи, нужно заставить вьюху брать нужный индекс
28 фев 13, 11:33    [13992835]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Glory
Member

Откуда:
Сообщений: 104751
ArtMan
статистика обновляется (день работает как надо, день не как надо)

Т.е. послед обновления статистики все "работает как надо" ?
28 фев 13, 11:36    [13992853]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Интересует хинт на выборку из вью.

а что мешает хинт в тексте вью написать?
28 фев 13, 11:37    [13992856]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ArtMan
нужно заставить вьюху брать нужный индекс

Я так понимаю, вы писали
SELECT *
FROM V WITH(INDEX(I_MYDATE))
WHERE MYDATE = @dt
?
А при этом случайно не получали сообщения "Warning: Index hints supplied for view 'dbo.V will be ignored"? :-)
28 фев 13, 11:42    [13992878]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
автор
а что мешает хинт в тексте вью написать?

Вью используется для других вещей, реально запрос с вью может работать с 10 разными датами, все даты имеют индексы.
Скажите, знаете как заставить вью брать нужный индекс абстрагировано скажите.
28 фев 13, 11:43    [13992883]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сделать view индексированным
If a table hint in the form of INDEX (index_val[ ,...n] ) references a view in a query and you do not also specify the NOEXPAND hint, the index hint is ignored. To specify use of a particular index, use NOEXPAND

Сообщение было отредактировано: 28 фев 13, 11:46
28 фев 13, 11:46    [13992897]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Пишет
Index hints supplied for view 'V' will be ignored.
28 фев 13, 11:48    [13992907]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Вью используется для других вещей, реально запрос с вью может работать с 10 разными датами, все даты имеют индексы.
> Скажите, знаете как заставить вью брать нужный индекс абстрагировано скажите.

напишите отдельную специально для вашего случая. или вообще вью не используйте.
во вью потенциально может быть несколько таблиц. а имя индекса уникально только в пределах таблицы. то есть у разных таблиц потенциально могут быть индексы с одинаковыми именами. и если две таких таблицы обнаружатся в одном вью, то непонятно будет об индексе на какую именно таблицу идет речь в хинте на выборке из вью. поэтому такие хинты просто ингнорируются.
28 фев 13, 11:49    [13992913]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Индексировать вьюху сложно, в вью входит еще куча вью ))))
28 фев 13, 11:49    [13992919]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
автор
напишите отдельную специально для вашего случая. или вообще вью не используйте.
во вью потенциально может быть несколько таблиц. а имя индекса уникально только в пределах таблицы. то есть у разных таблиц потенциально могут быть индексы с одинаковыми именами. и если две таких таблицы обнаружатся в одном вью, то непонятно будет об индексе на какую именно таблицу идет речь в хинте на выборке из вью. поэтому такие хинты просто ингнорируются.


таблица с нужным индексом употребляется много раз (((... как тогда разруливать, может через алиасы
28 фев 13, 11:51    [13992938]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> таблица с нужным индексом употребляется много раз (((... как тогда разруливать, может через алиасы

в текущей реализации сервера - никак не разруливать. нет такой возможности.
28 фев 13, 11:54    [13992960]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ArtMan
таблица с нужным индексом употребляется много раз (((... как тогда разруливать, может через алиасы

Э... а вариант — "напишите отдельную вью для вашего случая" — чем не подходит? Внутри этой вью укажите нужный индекс в тех местах, где это необходимо.
28 фев 13, 11:57    [13992990]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Спасибо за описание ошибки... буду теперь думать
28 фев 13, 12:11    [13993089]     Ответить | Цитировать Сообщить модератору
 Re: Хинты для VIEW  [new]
Crimean
Member

Откуда:
Сообщений: 13147
"добро пожаловать в клуб" (ц)

вопрос. а у вас случайно распределение данных не "аномальное"?
скажем, бывает так - есть поле, для которого 90% данных - "пусто". а 10% - почти уникальны
так вот, мало указать Field = @Value, хорошо указывать
Filed = @Value AND Field != "пусто"
ну или еще "классика" вместо where Field & @Mask != 0 стоит писать where Field != 0 AND Field & @Mask != 0
а в "проблемные" индексы докиньте в include полей, чтобы повысить его шансы на подхватывание - часто помогает
28 фев 13, 12:22    [13993157]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить