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

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

Анализирую выполнение 1С-овского запроса.
Отловил запрос в СУБД:

exec sp_executesql N'SELECT
T1.Period_,
T1.Fld1476RRef,
T1.Fld1477RRef,
T1.Fld1478_TYPE,
T1.Fld1478_L,
T1.Fld1478_N,
T1.Fld1478_RTRef,
T1.Fld1478_RRRef,
T1.RecorderTRef,
T1.RecorderRRef
FROM (SELECT
T4._Fld1477RRef AS Fld1477RRef,
T4._Fld1478_TYPE AS Fld1478_TYPE,
T4._Fld1478_L AS Fld1478_L,
T4._Fld1478_N AS Fld1478_N,
T4._Fld1478_RTRef AS Fld1478_RTRef,
T4._Fld1478_RRRef AS Fld1478_RRRef,
T4._Period AS Period_,
T4._RecorderTRef AS RecorderTRef,
T4._RecorderRRef AS RecorderRRef,
T4._Fld1476RRef AS Fld1476RRef
FROM (SELECT
T3._Fld1476RRef AS Fld1476RRef,
T3._Fld1477RRef AS Fld1477RRef,
MAX(T3._Period) AS MAXPERIOD_
FROM _InfoRg1475 T3 WITH (NOLOCK)
WHERE T3._Period <= @P1 AND T3._Active = 0x01 AND ((T3._Fld1477RRef = @P2))
GROUP BY T3._Fld1476RRef,
T3._Fld1477RRef) T2
INNER JOIN _InfoRg1475 T4 WITH (NOLOCK)
ON T2.Fld1476RRef = T4._Fld1476RRef AND T2.Fld1477RRef = T4._Fld1477RRef AND T2.MAXPERIOD_ = T4._Period) T1
WHERE (T1.Fld1478_TYPE = 0x08 AND T1.Fld1478_RTRef = @P3 AND T1.Fld1478_RRRef = @P4)',N'@P1 datetime,@P2 varbinary(16),@P3 varbinary(4),@P4 varbinary(16)','May  1 4014 12:00:00:000AM',0xBABA26FD153929F74FE746A9097FAE43,0x00000038,0xB0C5000C29FC45E111E3953B872362F3


В результате план запроса имеет следующий вид:
Картинка с другого сайта.

Смотрю расшифровку по оператору:
Картинка с другого сайта.

В предупреждениях видно, что "Столбцы без статистики: KeyCo4"
Что значит этот KeyCo4 ? В соответствующей таблице данных нет такого поля:

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

Подскажите пожалуйста - что оно значит?

//-----------------------------------------------------
И еще если я запрос из exec sp_executesql выполню отдельно, то в плане запроса IndexScan нет - везде IndexSeek. Почему при выполнении одноименного запроса через эту процедуру IndexScan ?

Спасибо за внимание.
16 июн 14, 12:12    [16168537]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Alex_MA,



Значит полное чтение таблицы, индексы не используются
16 июн 14, 13:26    [16169095]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alex_MA
И еще если я запрос из exec sp_executesql выполню отдельно

Интересно, а как вы его выполните отдельно, если там параметры ?
16 июн 14, 13:33    [16169158]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
Glory
Alex_MA
И еще если я запрос из exec sp_executesql выполню отдельно

Интересно, а как вы его выполните отдельно, если там параметры ?


    
SELECT
T1.Period_,
T1.Fld1476RRef,
T1.Fld1477RRef,
T1.Fld1478_TYPE,
T1.Fld1478_L,
T1.Fld1478_N,
T1.Fld1478_RTRef,
T1.Fld1478_RRRef,
T1.RecorderTRef,
T1.RecorderRRef
FROM (SELECT
T4._Fld1477RRef AS Fld1477RRef,
T4._Fld1478_TYPE AS Fld1478_TYPE,
T4._Fld1478_L AS Fld1478_L,
T4._Fld1478_N AS Fld1478_N,
T4._Fld1478_RTRef AS Fld1478_RTRef,
T4._Fld1478_RRRef AS Fld1478_RRRef,
T4._Period AS Period_,
T4._RecorderTRef AS RecorderTRef,
T4._RecorderRRef AS RecorderRRef,
T4._Fld1476RRef AS Fld1476RRef
FROM (SELECT
T3._Fld1476RRef AS Fld1476RRef,
T3._Fld1477RRef AS Fld1477RRef,
MAX(T3._Period) AS MAXPERIOD_
FROM _InfoRg1475 T3
WHERE T3._Period <= '1/05/2014 00:00:00' AND T3._Active = 0x01 AND T3._Fld1477RRef = '0xBABA26FD153929F74FE746A9097FAE43'
GROUP BY T3._Fld1476RRef,
T3._Fld1477RRef) T2
INNER JOIN _InfoRg1475 T4
ON T2.Fld1476RRef = T4._Fld1476RRef AND T2.Fld1477RRef = T4._Fld1477RRef AND T2.MAXPERIOD_ = T4._Period) T1
WHERE (T1.Fld1478_TYPE = 0x08 AND T1.Fld1478_RTRef = '0x00000038' AND T1.Fld1478_RRRef = '0xB0C5000C29FC45E111E3953B872362F3')
16 июн 14, 13:42    [16169232]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
Glory
Alex_MA
И еще если я запрос из exec sp_executesql выполню отдельно

Интересно, а как вы его выполните отдельно, если там параметры ?


Это понятно, что происходит скан индекса.
Меня интересует что такое нет статистики по полю KeyCo4 ?
16 июн 14, 13:44    [16169241]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Круто.
Заменил параметры разных типов на строковые константы и хочу, чтобы план остался таким же
16 июн 14, 13:44    [16169246]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Alex_MA
Glory
пропущено...

Интересно, а как вы его выполните отдельно, если там параметры ?


Это понятно, что происходит скан индекса.
Меня интересует что такое нет статистики по полю KeyCo4 ?


Значит не статистики по этому полю, но она была бы не лишней. Таблицы большая?

Меня на другом форуму закидали тухлыми помидорами за то, что я сейчас скажу. Но я всё же это скажу. Существуют ситуации, когда статистику надо создать самому и обновлять её джобой. Но делать это после того, как вы исчерпали другие возможности по оптимизации плана.

http://msdn.microsoft.com/en-us/library/ms188038.aspx
16 июн 14, 14:15    [16169492]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
Glory
Круто.
Заменил параметры разных типов на строковые константы и хочу, чтобы план остался таким же


Вообщем то так и думал, что так нельзя.
А как задавать параметры в запросе - ну например в данном случае.
Использовать convert ?
16 июн 14, 14:34    [16169644]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
a_voronin
Alex_MA
пропущено...


Это понятно, что происходит скан индекса.
Меня интересует что такое нет статистики по полю KeyCo4 ?


Значит не статистики по этому полю, но она была бы не лишней. Таблицы большая?

Меня на другом форуму закидали тухлыми помидорами за то, что я сейчас скажу. Но я всё же это скажу. Существуют ситуации, когда статистику надо создать самому и обновлять её джобой. Но делать это после того, как вы исчерпали другие возможности по оптимизации плана.

http://msdn.microsoft.com/en-us/library/ms188038.aspx


Я понимаю, что статистики нужно обновлять.
Для меня не понятна конкретная ситуация - что за поле такое KeyCol4 - его даже в полях таблицы нет (как видно на рисунке)
16 июн 14, 14:36    [16169661]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Alex_MA
a_voronin
пропущено...


Значит не статистики по этому полю, но она была бы не лишней. Таблицы большая?

Меня на другом форуму закидали тухлыми помидорами за то, что я сейчас скажу. Но я всё же это скажу. Существуют ситуации, когда статистику надо создать самому и обновлять её джобой. Но делать это после того, как вы исчерпали другие возможности по оптимизации плана.

http://msdn.microsoft.com/en-us/library/ms188038.aspx


Я понимаю, что статистики нужно обновлять.
Для меня не понятна конкретная ситуация - что за поле такое KeyCol4 - его даже в полях таблицы нет (как видно на рисунке)


Есть подозрение, что это означает 4 колонка ключа. Key Column 4 = KeyCo4 . У вас ключ там составной? В нём есть 4 поля?
16 июн 14, 14:48    [16169764]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
Glory
Круто.
Заменил параметры разных типов на строковые константы и хочу, чтобы план остался таким же


Переписал с приведением



SELECT
T1.Period_,
T1.Fld1476RRef,
T1.Fld1477RRef,
T1.Fld1478_TYPE,
T1.Fld1478_L,
T1.Fld1478_N,
T1.Fld1478_RTRef,
T1.Fld1478_RRRef,
T1.RecorderTRef,
T1.RecorderRRef
FROM (SELECT
T4._Fld1477RRef AS Fld1477RRef,
T4._Fld1478_TYPE AS Fld1478_TYPE,
T4._Fld1478_L AS Fld1478_L,
T4._Fld1478_N AS Fld1478_N,
T4._Fld1478_RTRef AS Fld1478_RTRef,
T4._Fld1478_RRRef AS Fld1478_RRRef,
T4._Period AS Period_,
T4._RecorderTRef AS RecorderTRef,
T4._RecorderRRef AS RecorderRRef,
T4._Fld1476RRef AS Fld1476RRef
FROM (SELECT
T3._Fld1476RRef AS Fld1476RRef,
T3._Fld1477RRef AS Fld1477RRef,
MAX(T3._Period) AS MAXPERIOD_
FROM _InfoRg1475 T3
WHERE
T3._Period <= CONVERT(datetime, '1/05/2014 00:00:00', 104) AND T3._Active = 0x01 AND
T3._Fld1477RRef = CONVERT(binary(16), '0xBABA26FD153929F74FE746A9097FAE43')
GROUP BY
T3._Fld1476RRef,
T3._Fld1477RRef) T2
INNER JOIN _InfoRg1475 T4
ON T2.Fld1476RRef = T4._Fld1476RRef AND T2.Fld1477RRef = T4._Fld1477RRef AND T2.MAXPERIOD_ = T4._Period) T1
WHERE (T1.Fld1478_TYPE = 0x08 AND T1.Fld1478_RTRef = CONVERT(binary(4), '0x00000038') AND T1.Fld1478_RRRef = CONVERT(binary(16), '0xB0C5000C29FC45E111E3953B872362F3'))


План запроса остался такой же.
16 июн 14, 14:48    [16169769]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Glory
Member

Откуда:
Сообщений: 104760
CONVERT(binary(4), '0x00000038') - это просто супер приведение
Мало того, что оно задает другие константы, так осталось еще понять, как оно из констант делает переменные
16 июн 14, 14:55    [16169833]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Alex_MA
Glory
Круто.
Заменил параметры разных типов на строковые константы и хочу, чтобы план остался таким же


Переписал с приведением



SELECT
T1.Period_,
T1.Fld1476RRef,
T1.Fld1477RRef,
T1.Fld1478_TYPE,
T1.Fld1478_L,
T1.Fld1478_N,
T1.Fld1478_RTRef,
T1.Fld1478_RRRef,
T1.RecorderTRef,
T1.RecorderRRef
FROM (SELECT
T4._Fld1477RRef AS Fld1477RRef,
T4._Fld1478_TYPE AS Fld1478_TYPE,
T4._Fld1478_L AS Fld1478_L,
T4._Fld1478_N AS Fld1478_N,
T4._Fld1478_RTRef AS Fld1478_RTRef,
T4._Fld1478_RRRef AS Fld1478_RRRef,
T4._Period AS Period_,
T4._RecorderTRef AS RecorderTRef,
T4._RecorderRRef AS RecorderRRef,
T4._Fld1476RRef AS Fld1476RRef
FROM (SELECT
T3._Fld1476RRef AS Fld1476RRef,
T3._Fld1477RRef AS Fld1477RRef,
MAX(T3._Period) AS MAXPERIOD_
FROM _InfoRg1475 T3
WHERE
T3._Period <= CONVERT(datetime, '1/05/2014 00:00:00', 104) AND T3._Active = 0x01 AND
T3._Fld1477RRef = CONVERT(binary(16), '0xBABA26FD153929F74FE746A9097FAE43')
GROUP BY
T3._Fld1476RRef,
T3._Fld1477RRef) T2
INNER JOIN _InfoRg1475 T4
ON T2.Fld1476RRef = T4._Fld1476RRef AND T2.Fld1477RRef = T4._Fld1477RRef AND T2.MAXPERIOD_ = T4._Period) T1
WHERE (T1.Fld1478_TYPE = 0x08 AND T1.Fld1478_RTRef = CONVERT(binary(4), '0x00000038') AND T1.Fld1478_RRRef = CONVERT(binary(16), '0xB0C5000C29FC45E111E3953B872362F3'))


План запроса остался такой же.


Я не думаю, что конвертация типов тут что-то решит. Попробуйте подойти к вопросу так.

Вставьте результат каждого подзапроса в отдельную временную таблицу. То есть разбейте запрос на три. Посмотрите ПЛАН на каждом этапе (3 плана). Не факт, что запрос надо будет оставлять в таком виде, но это позволит сузить область поиска проблемы.
16 июн 14, 14:56    [16169845]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Mind
Member

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

Если вы хотите чтобы вам ответили на вопрос по поводу плана, то выложите для сначала сам план, а не его картинку.
17 июн 14, 01:32    [16172928]     Ответить | Цитировать Сообщить модератору
 Re: Анализ плана запроса. не хватает статистики.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
a_voronin
Я не думаю, что конвертация типов тут что-то решит. Попробуйте подойти к вопросу так.

Вставьте результат каждого подзапроса в отдельную временную таблицу. То есть разбейте запрос на три. Посмотрите ПЛАН на каждом этапе (3 плана). Не факт, что запрос надо будет оставлять в таком виде, но это позволит сузить область поиска проблемы.
Каким образом это поможет ТС понять почему отличаются планы двух "одинаковых" запросов? Ведь в этом же была проблема насколько я понимаю.
17 июн 14, 01:35    [16172932]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить