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

Откуда:
Сообщений: 6
Приветствую!


Есть SQL запрос, который связывает между собой несколько таблиц, пара из которых достаточно большие
Внутри этого запроса есть фильтры, которые сильно ограничивает выборку (т.е. вместо милионов записей возвращаются максимум тысячи).
Фильтры эти в запрос передаются в виде параметров, т.е. WHERE выглядит так:

WHERE #1
T1.STATUS_CD = @P1 AND T3.ACTIVE_FLG != @P2 AND T2.STATUS_CD = @P3 AND T4.SERVER_NAME = @P4 AND T4.PROCESS_NUM = @P5


Значения параметров/переменных в общем-то постоянные и по факту соответствуют такому уловию:

WHERE #2
T1.STATUS_CD = 'Queued' AND T3.ACTIVE_FLG != 'N' AND T2.STATUS_CD = 'Active' AND T4.SERVER_NAME = 'prod_srv' AND T4.PROCESS_NUM = 1


Сам запрос работает долго, индексирование тут не поможет (разве что если в SQL сервер есть аналог реализации bitmap join index в Oracle) и решение проблемы я вижу в использование материализованного представления, т.е. indexed view.

Сам SQL ограничениям indexed view почти соответсвует - если выкинуть функции и один outer join.
В результате создан indexed view на базе такого модифицированного SQL с условиями как WHERE #2.

Если выполнить исходный SQL тоже с условиями WHERE #2, то оптимизатор соображает, что ему надо использовать indexed view, а не базовые таблицы и query rewrite работает прекрасно.

Если выполнить исходный SQL с условиями WHERE #1 (естественно, предварительно проинициализировав переменные соответствующими значениями), то оптимизатор наличие indexed view игнорирует и делает выборку из базовых таблиц.

Мне нужно, чтобы исходный запрос (с WHERE #1) использовал indexed view - можно ли этого добиться и как?

NB! У меня нет прямой возможности модифицировать текст запроса, он генерируется приложением.
5 июл 12, 12:48    [12821543]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Т.е. я вас правильно понял, что вы сделали индексированое представление для одного набора значений?
5 июл 12, 12:52    [12821588]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
индексирование тут не поможет


Интересно, почему же?! И, план запроса и структуры таблиц с имеющимися индексами не помешали бы.
5 июл 12, 12:53    [12821591]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Алексей Х.
Member

Откуда:
Сообщений: 6
Гавриленко Сергей Алексеевич
Т.е. я вас правильно понял, что вы сделали индексированое представление для одного набора значений?


Наверное, правильно. :-)

Суть в том, что "параметризированный" запрос гарантированно использует тот же самый набор значений.
И мне видится странными, что для него query rewrite почему-то не работает.
5 июл 12, 12:57    [12821625]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
option ( recompile )
5 июл 12, 12:58    [12821630]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Алексей Х.
Member

Откуда:
Сообщений: 6
pkarklin
автор
индексирование тут не поможет


Интересно, почему же?! И, план запроса и структуры таблиц с имеющимися индексами не помешали бы.


Кхм..., быть может Вы и правы.

Суть в том, что выборку значительно ограничивает вот эта комбинация условий:

T1.STATUS_CD = 'Queued' AND T2.STATUS_CD = 'Active'


T1 содержит 10+ млн записей, 10% из которых 'Queued, T2 содержит 60% записей 'Active'.
Таблицы связываются по условию T1.MEMBER_ID = T2.ROW_ID (M:1).
Есть индексы как на T1.MEMBER_ID, так и на T2.ROW_ID.

Пожалуй, можно попробовать создать дополнительные комбинированные индексы T1(МEMBER_ID,STATUS_CD) и T2(ROW_ID,STATUS_CD).
5 июл 12, 13:09    [12821716]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Алексей Х.
Member

Откуда:
Сообщений: 6
Гавриленко Сергей Алексеевич
option ( recompile )



Не помогло. :-(
Но за подсказку спасибо.

Вообще, надо бы попробовать на отвлеченном примере попроще, может я где-то чего-то не доглядел.
5 июл 12, 13:29    [12821863]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Алексей Х.
Member

Откуда:
Сообщений: 6
[quot Алексей Х.]
pkarklin
пропущено...

Пожалуй, можно попробовать создать дополнительные комбинированные индексы T1(МEMBER_ID,STATUS_CD) и T2(ROW_ID,STATUS_CD).


Нет, это не подходит - как я понимаю, SQL server не умеет index join.
5 июл 12, 13:36    [12821914]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47197
[quot Алексей Х.]
Алексей Х.
пропущено...


Нет, это не подходит - как я понимаю, SQL server не умеет index join.
Какая редакция сервера?
Если не Enterprise, то надо SELECT из индексированного view с хинтом WITH NOEXPAND делать.
Чтобы индекс view использовался.
5 июл 12, 13:53    [12822057]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Алексей Х.
Member

Откуда:
Сообщений: 6
[quot iap]
Алексей Х.
пропущено...
Какая редакция сервера?
Если не Enterprise, то надо SELECT из индексированного view с хинтом WITH NOEXPAND делать.
Чтобы индекс view использовался.


Enterprise, но WITH NOEXPAND ту не при делах - я не могу/не буду делать выборку из indexed view напрямую, мне нужно чтобы срабатывал query rewrite, т.е. исходный SQL (на базе которого я строю представление) использовал/подставлял indexed view вместо таблиц, на которых он постороен.
5 июл 12, 14:02    [12822122]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
[quot Алексей Х.]
iap
пропущено...


Enterprise, но WITH NOEXPAND ту не при делах - я не могу/не буду делать выборку из indexed view напрямую, мне нужно чтобы срабатывал query rewrite, т.е. исходный SQL (на базе которого я строю представление) использовал/подставлял indexed view вместо таблиц, на которых он постороен.

два запроса для набора параметров как в вьюшке и для остальных.
5 июл 12, 14:15    [12822243]     Ответить | Цитировать Сообщить модератору
 Re: Indexed view, query rewrite и параметризированный запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
Алексей Х.
Гавриленко Сергей Алексеевич
option ( recompile )
Не помогло. :-(
Баг?

Алексей Х.
Внутри этого запроса есть фильтры, которые сильно ограничивает выборку
Если основной отсев данных лежит на условиях фильтрации, то смотреть на индексированные представление нужно в последнюю очередь. Лучше уж смотреть на фильтрованные индексы.
pkarklin +1

Только если сама связка существенно отсеивает данные, тогда да, стоит. Или когда структура неоднородна и нет статистики меж-табличной корреляции данных (многоуровневой).
<Мечтательно>
А вот если можно было делать статистику на запросы (простые соединения) ... тогда компилятор не тупил бы в сложных многоуровневых запросах. Ах да:
C точки зрения маркетинга ­­– бесперспективно © invm
5 июл 12, 22:21    [12825232]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить