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

Откуда:
Сообщений: 82
Коллеги, приветствую!
Никак не могу разобраться в логике работы оптимизатора (MS SQL 2014). Вроде как, если я задаю условие под которое подходит большая часть строк таблицы, тогда у меня должен выбираться план со сканированием, т.к. это должно быть быстрее. Но на практике выбирается план с поиском по индексу.
Запрос:
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.

Почему так происходит?
Заранее спасибо за ответы.
2 авг 18, 18:09    [21625855]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36693
Потому что читать 149990 записей как правило не дольше, чем 150000.

Сообщение было отредактировано: 2 авг 18, 18:21
2 авг 18, 18:20    [21625891]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
Гавриленко Сергей Алексеевич,

А как же селективность индекса и все такое?
Если скорость чтения одинаковая, то почему именно Seek, а не Scan?
2 авг 18, 19:21    [21626067]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
Андрей_Батькович,

В вашем случае Index Seek = Range Scan
Подробнее - http://sqlblog.com/blogs/paul_white/archive/2011/02/17/so-is-it-a-seek-or-a-scan.aspx
2 авг 18, 19:57    [21626161]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Андрей_Батькович,

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

Для проверки этой догадки попробуйте "вежливо попросить" сервер перестраивать план каждый раз (option(recompile)) и посмотрите на результат при значении параметра 100.
2 авг 18, 19:58    [21626169]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Щукина Анна
Андрей_Батькович,

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

Для проверки этой догадки попробуйте "вежливо попросить" сервер перестраивать план каждый раз (option(recompile)) и посмотрите на результат при значении параметра 100.
2 авг 18, 20:00    [21626177]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
msLex
Member

Откуда:
Сообщений: 7730
Щукина Анна
Щукина Анна
Андрей_Батькович,

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

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


у ТС тривиальный план, там даже статистику смотреть не надо.
2 авг 18, 20:03    [21626180]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
msLex,

это вы на основании чего сделали такие выводы? ТС план не привел. А то, что он называет таблицей - на деле может оказаться представлением с кучей джойнов и развесистой логикой получение итогового результата... Вольный и до гениальности краткий (если верить пословице, что "краткость - сестра таланта") пересказ автором топика плана запроса - также не внушает доверия .
Но даже если и так, то сервер ,в принципе, мог "ошибитьс" и на линейном запросе из одной таблицы с единственным условием фильтрации. поэтому, как по мне, так совсем не очевидно, что у автора всё тривиально...
2 авг 18, 20:08    [21626189]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
msLex
Member

Откуда:
Сообщений: 7730
Щукина Анна
msLex,

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

С вью я сильно сомневаюсь (хотя кто знает), но вот выборка 1 поля из таблице с фильтром по этому полю и наличию индекса по этому же полю это точно тривиальный план.

Если приведете репро обратного, буду благодарен.
2 авг 18, 20:19    [21626208]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
invm,

склоняюсь к мысли, что очень похоже на правду...
"сиком" нашли первое вхождение искомой величины, а далее - (по сути) "сканим" индекс навигацией по двухсвязному списку листовых элементов индекса (как ни крути, но будет рэндж-скан). Так как кроме индексированного значение возвращать в результат селекта ничего не нужно, то лукапа на таблицу не возникает и "чисто механически" индекс-сик работает как индекс-скан. но зато сервер убил одним выстрелом двух зайцев - в случае, если прилетит параметр @p1 = 1 - для такого расклада вариант плана с сиком будет более чем кстати, в сравнении со сканом...
2 авг 18, 20:27    [21626231]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
Щукина Анна,

Я чистил процедурный кэш перед выполнением запроса, план все равно такой же.
План во вложении.

К сообщению приложен файл (111.rar - 1Kb) cкачать
2 авг 18, 20:30    [21626238]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
invm,

Действительно, судя по свойству оператора идет скан диапазона.
Спасибо!
2 авг 18, 20:32    [21626240]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Андрей_Батькович,

Ещё раз перечитайте ссылку от invmи мой предыдущий пост.
Вроде всё логично получается...
2 авг 18, 20:34    [21626241]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по индексу вместо скана. Почему?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Щукина Анна
Андрей_Батькович,

Ещё раз перечитайте ссылку от invmи мой предыдущий пост.
Вроде всё логично получается...
это было в посту 21626238, если что... :)
2 авг 18, 20:35    [21626244]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить