Rozetka UA

MS SQL SERVER. Query_hash и Query_plan_hash, что в этих числах

Дмитрий Горчилин

По материалам:

Блог инженеров технической поддержки SQL Server. Microsoft. Россия

http://blogs.technet.com/b/sqlruteam/archive/2014/11/09/sql_5f00_server_5f00_query_5f00_hash_5f00_and_5f00_query_5f00_plan_5f00_hash_5f00_part_5f00_1.aspx

http://blogs.technet.com/b/sqlruteam/archive/2014/11/11/sql_5f00_server_5f00_query_5f00_hash_5f00_and_5f00_query_5f00_plan_5f00_hash_5f00_part_5f00_2.aspx

Две части, третьей нет, интрига. А почему? Попробую пояснить.

 

Цитата:

Анализ содержимого процедурного кэша показал, что огромное количество одинаковых по коду запросов имеют записи в процедурном кэше.

Как видно на рисунке ниже некоторые планы повторяются по 200 и более раз.

Для получения этих данных я воспользовался этим «волшебным» числом «query_hash».

За счет многократного повторения запросов израсходовано дополнительно 62 ГБ оперативной памяти.

Как видно из рисунка ниже если бы планы выполнения многократно не повторялись, то для их размещения понадобилось бы 20 ГБ вместо 82 ГБ.

 

Приводится скрипт, который пришлось немного докрутить.

 

select sum(max_plan_size_mb) from

(select eqs.query_hash,max(eqp.size_in_bytes)/1048576 max_plan_size_mb

from sys.dm_exec_query_stats eqs

join sys.dm_exec_cached_plans eqp

on eqs.plan_handle =eqp.plan_handle

group by eqs.query_hash

)as a

 

select sum(max_plan_size_mb ) from

(select eqs.query_hash,sum(cast(eqp.size_in_bytes as bigint))/1048576 max_plan_size_mb

from sys.dm_exec_query_stats eqs

join sys.dm_exec_cached_plans eqp

on eqs.plan_handle =eqp.plan_handle

group by eqs.query_hash

)as a

 

Получаются какие-то совершенно космические цифры. Кто-то упорно жрет память, на некоторых серверах оказывается, что злодеи сожрали примерно треть оперативной памяти.

Но не надо отчаиваться! Инженеры не врачи, их бояться не нужно. Вот это полный размер и количество закэшированных планов, цифра значительно, в разы меньше посчитанной прошлыми скриптами:

 

SELECT sum(cast(size_in_bytes as bigint))/1048576 as sum_plan_size_mb,count(*) as count

FROM sys.dm_exec_cached_plans

 

Что за чудеса?

Дело в том, что в sys.dm_exec_cached_plans МЕНЬШЕ записей, чем в sys.dm_exec_query_stats. Несколько записей sys.dm_exec_query_stats могут ссылаться на один план. Соответственно, их скриптом один и тот же план может быть посчитан несколько раз. Соответственно, несколько раз просуммирован его размер, что неправильно.

 

Вывод 1: дурят православных
Вывод 2:не доверяйте бездумно инженерам, особенно если это инженеры Microsoft 🙂

 

Что до третьей части- судя по всему, авторы планировали там рассказать о принудительной параметризации, но кто-то из читателей оказался шибко умным, прочел текст внимательно. Инженеры обиделись и не написали больше.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Pratik UaPratik UaPratik Ua