powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск по индексу вместо скана. Почему?
14 сообщений из 14, страница 1 из 1
Поиск по индексу вместо скана. Почему?
    #39682737
Коллеги, приветствую!
Никак не могу разобраться в логике работы оптимизатора (MS SQL 2014). Вроде как, если я задаю условие под которое подходит большая часть строк таблицы, тогда у меня должен выбираться план со сканированием, т.к. это должно быть быстрее. Но на практике выбирается план с поиском по индексу.
Запрос:
Код: sql
1.
2.
3.
4.
5.
exec sp_executesql N'INSERT INTO #tt1 WITH(TABLOCK) (_Q_001_F_000) 
SELECT
T1._Fld1247
FROM dbo._Reference938 T1
WHERE (T1._Fld1247 = @P1)',N'@P1 numeric(10)',100



В таблице 150 тыс. записей, в поле _Fld1247 всего 10 значений которые равны 1, остальные равны 100. По идее в текущем запросе оптимизатор должен был бы выбрать скан индекса ведь я возвращаю почти всю таблицу, но идет Index Seek.

Почему так происходит?
Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682741
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что читать 149990 записей как правило не дольше, чем 150000.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682771
Гавриленко Сергей Алексеевич,

А как же селективность индекса и все такое?
Если скорость чтения одинаковая, то почему именно Seek, а не Scan?
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682789
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей_Батькович,

В вашем случае Index Seek = Range Scan
Подробнее - http://sqlblog.com/blogs/paul_white/archive/2011/02/17/so-is-it-a-seek-or-a-scan.aspx
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682790
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей_Батькович,

Возможно, в первый раз запрос выполнялся со значением параметра @P1 = 1 ?
Тогда сервер "честно подсмотрел" это значение, увидел, что оно равно 1, понял, то для такого расклада проще делать индекс скан, и сложил "кривой план" себе в голову кэш планов.
Во второй же раз сервер уже по "накатанной" выполнил запрос с тем же планом, что и раньше, несмотря на то, что значение параметра изменилось с 1 на 100.

Для проверки этой догадки попробуйте "вежливо попросить" сервер перестраивать план каждый раз (option(recompile)) и посмотрите на результат при значении параметра 100.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682791
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаАндрей_Батькович,

Возможно, в первый раз запрос выполнялся со значением параметра @P1 = 1 ?
Тогда сервер "честно подсмотрел" это значение, увидел, что оно равно 1, понял, то для такого расклада проще делать индекс скан seek , конечно же, и сложил "кривой план" себе в голову кэш планов.
Во второй же раз сервер уже по "накатанной" выполнил запрос с тем же планом, что и раньше, несмотря на то, что значение параметра изменилось с 1 на 100.

Для проверки этой догадки попробуйте "вежливо попросить" сервер перестраивать план каждый раз (option(recompile)) и посмотрите на результат при значении параметра 100.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682793
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаЩукина АннаАндрей_Батькович,

Возможно, в первый раз запрос выполнялся со значением параметра @P1 = 1 ?
Тогда сервер "честно подсмотрел" это значение, увидел, что оно равно 1, понял, то для такого расклада проще делать индекс скан seek , конечно же, и сложил "кривой план" себе в голову кэш планов.
Во второй же раз сервер уже по "накатанной" выполнил запрос с тем же планом, что и раньше, несмотря на то, что значение параметра изменилось с 1 на 100.

Для проверки этой догадки попробуйте "вежливо попросить" сервер перестраивать план каждый раз (option(recompile)) и посмотрите на результат при значении параметра 100.

у ТС тривиальный план, там даже статистику смотреть не надо.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682794
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

это вы на основании чего сделали такие выводы? ТС план не привел. А то, что он называет таблицей - на деле может оказаться представлением с кучей джойнов и развесистой логикой получение итогового результата... Вольный и до гениальности краткий (если верить пословице, что "краткость - сестра таланта") пересказ автором топика плана запроса - также не внушает доверия .
Но даже если и так, то сервер ,в принципе, мог "ошибитьс" и на линейном запросе из одной таблицы с единственным условием фильтрации. поэтому, как по мне, так совсем не очевидно, что у автора всё тривиально...
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682802
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаmsLex,

это вы на основании чего сделали такие выводы? ТС план не привел. А то, что он называет таблицей - на деле может оказаться представлением с кучей джойнов и развесистой логикой получение итогового результата... Вольный и до гениальности краткий (если верить пословице, что "краткость - сестра таланта") пересказ автором топика плана запроса - также не внушает доверия .
Но даже если и так, то сервер ,в принципе, мог "ошибитьс" и на линейном запросе из одной таблицы с единственным условием фильтрации. поэтому, как по мне, так совсем не очевидно, что у автора всё тривиально...
С вью я сильно сомневаюсь (хотя кто знает), но вот выборка 1 поля из таблице с фильтром по этому полю и наличию индекса по этому же полю это точно тривиальный план.

Если приведете репро обратного, буду благодарен.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682809
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

склоняюсь к мысли, что очень похоже на правду...
"сиком" нашли первое вхождение искомой величины, а далее - (по сути) "сканим" индекс навигацией по двухсвязному списку листовых элементов индекса (как ни крути, но будет рэндж-скан). Так как кроме индексированного значение возвращать в результат селекта ничего не нужно, то лукапа на таблицу не возникает и "чисто механически" индекс-сик работает как индекс-скан. но зато сервер убил одним выстрелом двух зайцев - в случае, если прилетит параметр @p1 = 1 - для такого расклада вариант плана с сиком будет более чем кстати, в сравнении со сканом...
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682811
Щукина Анна,

Я чистил процедурный кэш перед выполнением запроса, план все равно такой же.
План во вложении.
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682812
invm,

Действительно, судя по свойству оператора идет скан диапазона.
Спасибо!
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682813
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей_Батькович,

Ещё раз перечитайте ссылку от invm-и и мой предыдущий пост.
Вроде всё логично получается...
...
Рейтинг: 0 / 0
Поиск по индексу вместо скана. Почему?
    #39682814
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаАндрей_Батькович,

Ещё раз перечитайте ссылку от invm-и и мой предыдущий пост.
Вроде всё логично получается...это было в посту 21626238 , если что... :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск по индексу вместо скана. Почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]