Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск по индексу вместо скана. Почему? / 14 сообщений из 14, страница 1 из 1
02.08.2018, 18:09
    #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
02.08.2018, 18:20
    #39682741
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по индексу вместо скана. Почему?
Потому что читать 149990 записей как правило не дольше, чем 150000.
...
Рейтинг: 0 / 0
02.08.2018, 19:21
    #39682771
Поиск по индексу вместо скана. Почему?
Гавриленко Сергей Алексеевич,

А как же селективность индекса и все такое?
Если скорость чтения одинаковая, то почему именно Seek, а не Scan?
...
Рейтинг: 0 / 0
02.08.2018, 19:57
    #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
02.08.2018, 19:58
    #39682790
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по индексу вместо скана. Почему?
Андрей_Батькович,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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