07.05.2008, 10:29 | #1 |
Участник
|
Изменение плана запроса при увеличении выборки
Есть таблица в которой много записей (17 млн). В ней есть поле SalesDate типа дата и по этому полю есть индекс. Выполняется SQL-запрос:
X++: SELECT * FROM TABLE WHERE SALESDATE >= С чем может быть связано такое поведение? Реиндексация и обновление статистики не помогает. |
|
07.05.2008, 10:49 | #2 |
Участник
|
Что значит "с чем"? Сам же и ответил - отличается больше чем на неделю.
Оптимизатор сервера пришел к выводу, что получить эту выборку будет быстрее, если сканировать не индекс, а саму таблицу. Ведь в данном случае "оптимизация" - означает "ускорение". Использование индекса - далеко не всегда приводит именно к "ускорению". |
|
07.05.2008, 11:01 | #3 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Что значит "с чем"? Сам же и ответил - отличается больше чем на неделю.
Оптимизатор сервера пришел к выводу, что получить эту выборку будет быстрее, если сканировать не индекс, а саму таблицу. Ведь в данном случае "оптимизация" - означает "ускорение". Использование индекса - далеко не всегда приводит именно к "ускорению". X++: SELECT * FROM TABLE(INDEX( )) WHERE SALESDATE >= |
|
07.05.2008, 11:29 | #4 |
Участник
|
Кусок кода из метода \\Classes\\InventDimCtrl_Frm_OnHand\modifyQuery:
X++: qbsDim.addSortIndex(indexnum(InventDim,DimIdIdx)); qbsDim.indexIsHint(true); |
|
07.05.2008, 11:45 | #5 |
Участник
|
Цитата:
addSortIndex указывает, что нужно использовать индекс при выполнении сортировки (добавляет USING INDEX DimIdIdx) в секцию ORDER BY запроса, а нужно чтобы нужный индекс использовался при выборке данных |
|
07.05.2008, 11:47 | #6 |
Участник
|
Для этого там и указана еще вторая строка - indexIsHint
Если бы ее не было, то индекс использовался бы для сортировки Если она есть, это дает указание системе использовать этот индекс при выборке данных. Проверьте. Должно помочь |
|
07.05.2008, 11:56 | #7 |
Участник
|
Может быть теоретически это и так, но практически получается, что к запросу в аксапте добавляется INDEXISHINT после SELECT и USING INDEX в ORDER BY, но на сервер уходит такой же запрос, что и без указания этих параметров, следовательно план запроса не изменяется.
|
|
07.05.2008, 11:59 | #8 |
Участник
|
Хм. Прикольно. Редкий случай, когда указание индекса не просто оправдано, но необходимо.
Оптимизатор тоже прав. У него куча запросов по последнему дню. Есть кластерный индекс по SalesId, так как SalesID постоянно растёт, т.е. растёт вместе с датой. Отсюда и вывод оптимизатора - зачем нужен индекс, если результат без индекса такой же, что с индексом, но быстрее. Очень интересный случай Вопрос, как оптимизатор определил, что в старых записях не поменялись даты. Видимо, кеширует старые результаты. Но здесь надо спецов по СУБД MS SQL теребить. |
|
07.05.2008, 12:02 | #9 |
Участник
|
Странно, недавно проверял запросы, связанные с выборкой по складских аналитикам. План запроса явно меняется при изменении хинтов и время выборки тоже. Более того, оптимизировать запросы в этой части логистики вообще было бы невозможно во многих случаях работы с логистикой.
|
|
07.05.2008, 12:26 | #10 |
Участник
|
Lucky13, а какой SQL Server используете?
|
|
07.05.2008, 12:36 | #11 |
Участник
|
Оптимизатор смотрит на статистику (вы ее давно перестраивали)
В книжке про оракл упоминалось правило 5 процентов - если индекс позволяет выбрать 5% записей, то он используется иначе - нет (давно было могу чо-то наврать) |
|
07.05.2008, 13:01 | #12 |
Участник
|
MS SQL 2005
Цитата:
За 10 дней - результат 595 записей, поиск по индексу За 11 дней - результат 637 записей, поиск не по индексу При общем количестве записей 17 млн и то и другое явно меньше 5% |
|
07.05.2008, 13:05 | #13 |
Member
|
Цитата:
Сообщение от Lucky13
...
За 10 дней - результат 595 записей, поиск по индексу За 11 дней - результат 637 записей, поиск не по индексу ... Оценки оптимизатора более-менее соответствуют реальности?
__________________
С уважением, glibs® |
|
07.05.2008, 13:07 | #14 |
Участник
|
а какой кластерный индекс на вашей таблице?
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
07.05.2008, 13:21 | #15 |
Участник
|
|
|
07.05.2008, 13:24 | #16 |
Участник
|
|
|
07.05.2008, 13:28 | #17 |
Member
|
В Management Studio при расчете плана исполнения запроса.
В чертеже плана исполнения запроса наведите мышу на select в самом верхнем уровне и во всплывающем окне прочитайте Estimated Number of Rows. По идее, должно быть более-менее похожим на реальные данные (с учетом того, что статистика строится по статистической выборке данных).
__________________
С уважением, glibs® |
|
07.05.2008, 13:35 | #18 |
Участник
|
|
|
07.05.2008, 13:51 | #19 |
Участник
|
может вам попробовать
X++: SELECT * FROM TABLE WHERE SALESDATE >= && SALESDATE < datemax()
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
07.05.2008, 13:56 | #20 |
Участник
|
|
|
Теги |
план запроса, производительность, статистика, запрос (query), индекс |
|
|