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

Откуда: Вологда
Сообщений: 190
Здравствуйте!

есть запрос:

exec sp_executesql N'SELECT DISTINCT
T1._IDRRef
FROM _Reference53 T1 WITH(NOLOCK)
INNER JOIN (SELECT
T5._Fld1476RRef AS Fld1476RRef,
T5._Fld1478_TYPE AS Fld1478_TYPE,
T5._Fld1478_L AS Fld1478_L,
T5._Fld1478_N AS Fld1478_N,
T5._Fld1478_RTRef AS Fld1478_RTRef,
T5._Fld1478_RRRef AS Fld1478_RRRef
FROM (SELECT
T4._Fld1476RRef AS Fld1476RRef,
T4._Fld1477RRef AS Fld1477RRef,
MAX(T4._Period) AS MAXPERIOD_
FROM _InfoRg1475 T4 WITH(NOLOCK)
WHERE T4._Period <= @P1 AND T4._Active = 0x01 AND ((T4._Fld1477RRef = @P2))
GROUP BY T4._Fld1476RRef,
T4._Fld1477RRef) T3
INNER JOIN _InfoRg1475 T5 WITH(NOLOCK)
ON T3.Fld1476RRef = T5._Fld1476RRef AND T3.Fld1477RRef = T5._Fld1477RRef AND T3.MAXPERIOD_ = T5._Period) T2
ON (T2.Fld1476RRef = T1._IDRRef)
WHERE (T2.Fld1478_TYPE = 0x08 AND T2.Fld1478_RTRef = @P3 AND T2.Fld1478_RRRef IN (@P4))',N'@P1 datetime,@P2 varbinary(16),@P3 varbinary(4),@P4 varbinary(16)','Sep  6 4014 12:00:00:000AM',0x8231B840BC5C951D4D760C9A41E4680F,0x00000800,0x8AB1000C29FC45E111E3819D053D3236


У таблицы _InfoRg1475 есть индексы:

Картинка с другого сайта.

В результате все равно выполняется scan:

Картинка с другого сайта.

Таблица очень большая 16млн.записей.
Подскажите пожалуйста почему так происходит ? И еще, почему у картинки операции в кружочке стрелочки ?

Спасибо за внимание.
6 сен 14, 12:55    [16543922]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Alex_MA
Подскажите пожалуйста почему так происходит ?
У вас в запросе используется 2 экземпляра таблицы _InfoRg1475, они связаны между собой по полям _Fld1476RRef и _Fld1477RRef, плюс по _Period

Дополнительно в выборке на каждую из э
тих таблиц есть условия.

Так вот, у вас есть индекс по условиям для одного экземпляра, а вторую то выборку тоже нужно получить

Вот для этого условия: T4._Period <= @P1 AND T4._Active = 0x01 AND ((T4._Fld1477RRef = @P2)) тоже нужен индекс.

Например, можно попробовать по полям _Fld1477RRef и _Period, фильтрованный по _Active = 0x01, с включением _Fld1476RRef и _Fld1477RRef
6 сен 14, 13:32    [16543966]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Alex_MA
И еще, почему у картинки операции в кружочке стрелочки ?
Это значок параллельного процесса.
6 сен 14, 13:36    [16543969]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
если убираю это условие:
WHERE (T2.Fld1478_TYPE = 0x08 AND T2.Fld1478_RTRef = @P3 AND T2.Fld1478_RRRef IN (@P4))
то происходит seek таблицы
6 сен 14, 13:41    [16543978]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
exec sp_executesql N'SELECT
T1._Fld1476RRef
FROM _InfoRg1475 T1 WITH(NOLOCK) 
WHERE (T1._Fld1478_TYPE = 0x08 AND T1._Fld1478_RTRef = @P1 AND T1._Fld1478_RRRef = @P2)',N'@P1 varbinary(4),@P2 varbinary(16)',0x00000800,0x8AB1000C29FC45E111E3819D053D3236


Даже выполнение такого запроса инициирует параллельный скан индекса:
Картинка с другого сайта.
6 сен 14, 14:30    [16544031]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
babona
Member [заблокирован]

Откуда: Батуринск
Сообщений: 1816
Alex_MA,

автор
Таблица очень большая 16млн.записей.


большая ??? так себе табличка.
Код оформляете отвратно
6 сен 14, 15:18    [16544117]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Alex_MA
Даже выполнение такого запроса инициирует параллельный скан индекса

Странно.

Статистику, что ли, обновите для _InfoRg1475.
6 сен 14, 15:25    [16544122]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Alex_MA
если убираю это условие:
WHERE (T2.Fld1478_TYPE = 0x08 AND T2.Fld1478_RTRef = @P3 AND T2.Fld1478_RRRef IN (@P4))
то происходит seek таблицы
А по какому индексу seek?
6 сен 14, 15:26    [16544124]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
типы параметро
Guest
Alex_MA,

по полному запросу - несоответствие того, по каким полям и в каком порядке на самом деле должно выполняться соединение и ваших ожиданий того что фильтрация - это то что в where. where ваш похоже не особо-то и фильтрует, если даже простая выборка в scan вываливается; и/или статистику надо обновить.
а начинается объединение с Fld1477RRef, которое в приведенном индексе на последнем месте стоит.
более оптимально по мнению сервера не с where начинать, а с результата подзапроса с группировкой.
seek без where происходит потому что подхватывается подходящий для объединения индекс, в котором нет полей указанных в where.
+для порядку типы параметров хорошо бы привести в соответствие типам столбцов.
6 сен 14, 18:36    [16544398]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
типы параметро
если даже простая выборка в scan вываливается
Вот это непонятно. Там же лазить в кластерный индекс не должен, все поля есть в индексе, почему сиквел его не использует?
6 сен 14, 19:00    [16544436]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Alex_MA,

Покажите весь план. Есть подозрение что implicit type conversion для binary -> varbinary приводит к скану.
Версия sql server какая?
7 сен 14, 13:28    [16545927]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Alex_MA
У таблицы _InfoRg1475 есть индексы:
А они включены то хоть?
Добавьте индекс хинт и посмотрите на план.
8 сен 14, 23:17    [16552275]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Это "штатный" код 1с 8.Х серии.
Вычисляется срез последних по регистру с периодическими значениями.

Автору могу только соболезновать - кодо MS SQL генератор в 8 ке , особенно 8.2 весрии ужасен. Лучше оставаться на 8.1.

В качестве решения - используйте в 1с свой механизм вычисления максимальных дат по реквизитам во временную таблицу и ее уже объединяйте с регистром еще раз, для получения результата. Вы удивитесь, что скорость вырастет от 2 до 10 раз в зависимости от железа.

Уже проходили и не раз.

Так же не мешает обновить статистику по таблице и убрать кеш запросов.
Из-за таких вот "динамических запросов" вся статистика на MS SQL и планы запросов - мягко говоря - ни о чем.
9 сен 14, 07:40    [16552595]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Volochkova,

Почему все таки происходит scan таблицы? кодогенератор тут явно не причем.
10 сен 14, 00:43    [16557157]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Mind
Volochkova,

Почему все таки происходит scan таблицы? кодогенератор тут явно не причем.


Он то как раз и при чем.
1. Такой текст, красный, у него проблемы со статистикой. Это проблема 1с ки. Она к субд обращается как к хранилищу, вот MS SQL и понимает, то лучше сканировать таблицу, нет правильной статистики.

2. в индексах с 1с не менее все сложно.

Делайте обновление статистики, ребилд таблицам и обнуление статистики планов запросов.

Должно помочь.
10 сен 14, 05:30    [16557265]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Mind
Volochkova,

Почему все таки происходит scan таблицы? кодогенератор тут явно не причем.


Кстати, полей T5._Fld1478_L AS Fld1478_L,
T5._Fld1478_N AS Fld1478_N, нет в индексах, а они выбираются. Видимо проще брать в табличке чем искать.
10 сен 14, 05:36    [16557267]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Volochkova
Mind
Volochkova,

Почему все таки происходит scan таблицы? кодогенератор тут явно не причем.


Он то как раз и при чем.
1. Такой текст, красный, у него проблемы со статистикой. Это проблема 1с ки. Она к субд обращается как к хранилищу, вот MS SQL и понимает, то лучше сканировать таблицу, нет правильной статистики.
Простите, но вы несете ересь, не имеющую никакого отношения к вопросу. Красный текст? А какой он должен быть, зеленый?

"exec sp_executesql" это стандартный метод запуска параметризированного запроса. Попробуйте выполнить запрос с параметрами из .NET приложения и посмотрите профайлером что будет отправлено на сервер. О ужас, ужас - красный текст.
10 сен 14, 20:38    [16561496]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Mind
Volochkova
пропущено...


Он то как раз и при чем.
1. Такой текст, красный, у него проблемы со статистикой. Это проблема 1с ки. Она к субд обращается как к хранилищу, вот MS SQL и понимает, то лучше сканировать таблицу, нет правильной статистики.
Простите, но вы несете ересь, не имеющую никакого отношения к вопросу. Красный текст? А какой он должен быть, зеленый?

"exec sp_executesql" это стандартный метод запуска параметризированного запроса. Попробуйте выполнить запрос с параметрами из .NET приложения и посмотрите профайлером что будет отправлено на сервер. О ужас, ужас - красный текст.


Ну значит ересь.
Если из .NET нельзя склеить нормальный запрос, то это конечно не ересь.
В остальном переубеждать не буду.
11 сен 14, 01:56    [16562009]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Volochkova
Mind
пропущено...
Простите, но вы несете ересь, не имеющую никакого отношения к вопросу. Красный текст? А какой он должен быть, зеленый?

"exec sp_executesql" это стандартный метод запуска параметризированного запроса. Попробуйте выполнить запрос с параметрами из .NET приложения и посмотрите профайлером что будет отправлено на сервер. О ужас, ужас - красный текст.


Ну значит ересь.
Если из .NET нельзя склеить нормальный запрос, то это конечно не ересь.
В остальном переубеждать не буду.
Нормальный это который? С константами вместо параметров? У нас с вами разные понятия о нормальности значит.
11 сен 14, 20:40    [16565853]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Mind
Volochkova
пропущено...


Ну значит ересь.
Если из .NET нельзя склеить нормальный запрос, то это конечно не ересь.
В остальном переубеждать не буду.
Нормальный это который? С константами вместо параметров? У нас с вами разные понятия о нормальности значит.


Это очевидно, но MSSQL такие запросы тоже не по вкусу.
А этот запрос написанный немного иначе, был бы "вкуснее" и быстрее для ms sql
12 сен 14, 03:44    [16566560]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Текст там красный оттого, что это стринговый литерал, который форматтер отображает красным. В том числе в профайлере. В том числе и не только для текста sp_executesql.

К сообщению приложен файл. Размер - 6Kb
12 сен 14, 06:37    [16566602]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Volochkova
А этот запрос написанный немного иначе, был бы "вкуснее" и быстрее для ms sql
Да что может быть вкуснее запроса:
SELECT T1._Fld1476RRef
FROM _InfoRg1475 T1 WITH(NOLOCK) 
WHERE (T1._Fld1478_TYPE = 0x08 AND T1._Fld1478_RTRef = @P1 AND T1._Fld1478_RRRef = @P2)

При наличии индекса по полям_Fld1478_TYPE, _Fld1478_RTRef, _Fld1478_RRRef, _Fld1476RRef?
Почему этот индекс не используется?
12 сен 14, 09:42    [16566861]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
alexeyvg
Volochkova
А этот запрос написанный немного иначе, был бы "вкуснее" и быстрее для ms sql
Да что может быть вкуснее запроса:
SELECT T1._Fld1476RRef
FROM _InfoRg1475 T1 WITH(NOLOCK) 
WHERE (T1._Fld1478_TYPE = 0x08 AND T1._Fld1478_RTRef = @P1 AND T1._Fld1478_RRRef = @P2)

При наличии индекса по полям_Fld1478_TYPE, _Fld1478_RTRef, _Fld1478_RRRef, _Fld1476RRef?
Почему этот индекс не используется?


Вот такие запросы - самый смак.
А вот то что было в 1 посте, это мрак.
а про почему не такой индекс, я уже написала.

У таблички бы fill factor посмотреть, да и статистику обновить бы.
12 сен 14, 13:15    [16568070]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит scan таблицы ?  [new]
хмхмхм
Guest
Alex_MA,

выложили бы вы полное репо, чтобы его можно было воспроизвести на любом сервере, а то ведь так не хочется гадать есть ли индекс или нет, какие индексы на таблицах, какой fill factor и т.п.
12 сен 14, 14:42    [16568663]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить