Что указывает запись «timeout» для sys.dm_exec_query_optimizer_info? - PullRequest
1 голос
/ 06 января 2009

Во время расследования, когда некоторые клиентские машины теряли связь с SQL Server 2005, я наткнулся на следующую строку кода в Интернете:

Выбрать * FROM sys.dm_exec_query_optimizer_info WHERE counter = 'timeout'

Когда я запускаю этот запрос на нашем сервере - мы получаем следующие результаты:

counter - вхождение - значение

тайм-аут - 9100 - 1

Насколько я могу определить, это означает, что время ожидания оптимизатора запросов при попытке оптимизировать запросы, выполняемые на нашем сервере, составляет 9100 раз. Однако мы не видим ошибок тайм-аута в журнале ошибок SQL Server, и наши конечные пользователи не сообщали о каких-либо конкретных ошибках тайм-аута.

Может кто-нибудь сказать мне, что означает это число «происшествий»? Это проблема, о которой мы должны беспокоиться?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2015

Этот счетчик не имеет никакого отношения к вашим проблемам с подключением.

SQL Server не будет тратить вечно, пытаясь составить наилучший из возможных планов ( по крайней мере без использования флагов трассировки ).

Он рассчитывает два значения в начале процесса оптимизации.

  1. Стоимость достаточно хорошего плана
  2. Максимальное время, затрачиваемое на оптимизацию запросов (измеряется числом выполненных задач преобразования, а не временем).

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

Причина, по которой оптимизация завершена досрочно, отображается в плане выполнения в атрибуте StatementOptmEarlyAbortReason. На самом деле существует три возможных значения.

  • Найден достаточно хороший план
  • Тайм-аут
  • Превышен лимит памяти.

Время ожидания увеличит счетчик, о котором вы спрашиваете в sys.dm_exec_query_optimizer_info.

Дополнительная литература

0 голосов
/ 06 января 2009

Извините, в документации говорится, что это только для внутреннего использования.

Основываясь на другой ссылке, я подозреваю, что это для внутренних тайм-аутов двигателя (например, SET QUERY_GOVERNOR_COST_LIMIT)

Время ожидания клиента также не будет зарегистрировано в SQL, поскольку клиент прерывает пакет, останавливая обработку SQL.

Пожалуйста, у вас есть более подробная информация?

0 голосов
/ 06 января 2009

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

Смотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...