|  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), индекс | 
|  | 
| 
 |