Описание блокировки SQL Server причиной блокировки компиляции

Переводы статьи Переводы статьи
Код статьи: 263889 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В Microsoft SQL Server только одна копия плана хранимой процедуры обычно является в кэш одновременно. Применение этого требует сериализации некоторых частей процесса компиляции и синхронизация частично осуществляется с помощью компиляции блокировок. Если число подключений одновременно запущены одной хранимой процедуры и блокировки compile должно быть получено для этой хранимой процедуры при каждом запуске, системного процесса (SPID) идентификаторы могут начать блокируют друг друга, при каждой попытке получить компиляции монопольную блокировку объекта.

Дополнительная информация

Перекомпиляции хранимых процедур — одну причину блокировки компиляции хранимой процедуры или триггера. Решение в данном случае — уменьшить или устранить повторных компиляций. Описание наиболее распространенных причин, возможно, придется перекомпилировать хранимую процедуру, а также некоторые полезные сведения о снизить частоту повторных компиляций обратитесь к следующей статье Microsoft Knowledge Base:
243586 Устранение неполадок перекомпиляции хранимых процедур
Еще один сценарий, в котором происходит блокировка компиляции, когда выполняются следующие условия:
  • Пользователь, запускающий выполнение хранимой процедуры, не является владельцем процедуры.
  • Имя хранимой процедуры не является полным именем владельца объекта.
Например, если пользователь «dbo» является владельцем объекта dbo.mystoredproc и другим пользователем, «Гарри» выполняет эту хранимую процедуру с помощью команды «exec mystoredproc,» потери кэша уточняющего запроса при сбое имя объекта, так как объект не является владельцем. (Он еще не известна существует ли другой хранимой процедуры с именем Harry.mystoredproc. Поэтому SQL Server нельзя быть уверенным, что необходимый для выполнения кэшированного плана для dbo.mystoredproc.) Затем SQL Server получает компиляции монопольную блокировку процедуры и делает подготовительные действия для компиляции процедуры. Это включает в себя сопоставление имени объекта для идентификатора объекта. Прежде, чем SQL Server компилирует план, SQL Server использует этот идентификатор объекта для выполнения более точного поиска в кэше процедур и можно найти ранее скомпилированный план даже без указания полного имени владельца.

Если обнаружен существующий план SQL Server повторно использует кэшированный план и фактически не компиляцию хранимой процедуры. Тем не менее недостаточная квалификация владельца заставляет SQL Server выполняют второй просмотр кэша и получения блокировки монопольного компиляции перед программа определяет, что можно повторно использовать кэшированный готовый план. Получение блокировки и выполняет уточняющие запросы и другой работы, необходимой для достижения этой точки может внести задержка для компиляции блокировок, приводит к блокировке. Это особенно справедливо, если многие пользователи, не являющиеся одновременно запустить процедуру без указания имени владельца владелец хранимой процедуры. Имейте в виду, что даже в том случае, если SPID, Ожидание блокировки компиляции отсутствует, отсутствия квалификации владельца может вызвать задержки при выполнении хранимой процедуры и привести к нежелательному высокая загрузка ЦП.

Следующая последовательность событий записываются в трассировки приложения SQL Server Profiler, при возникновении этой проблемы. (Для трассировки событий, связанных с кэшем, необходимо включить дополнительные события. Для этого нажмите кнопкуПараметры В меню Сервис меню, а затем выберите Все классы событий.)

Свернуть эту таблицуРазвернуть эту таблицу
Класс событийТекст
RPC: запускmystoredproc
SP: CacheMissmystoredproc
SP:ExecContextHitmystoredproc
SP: запускmystoredproc
......

SP: CacheMissвозникает при сбое кэша поиска по имени. Ниже SP:ExecContextHit Указывает, что соответствующий кэшированного плана в конечном счете найден в кэше после имени объекта неоднозначное был разрешен для идентификатора объекта. В зависимости от обстоятельств SP: CacheHitотображается в спискеSP:ExecContextHit.

Чтобы убедиться, что ссылки на хранимые процедуры с указанием владельца является решением этой проблемы блокировки компиляции. (Вместо Exec mystoredproc, с помощью exec dbo.mystoredproc.) Квалификация владельца является важной для повышения производительности, нет необходимости уточнять хранимая процедура с именем базы данных для предотвращения дополнительных кэша уточняющего запроса.

Блокировка, которая возникает из-за компиляции блокировки могут быть обнаружены с помощью блокировки сценариев, такие как те, которые определены в следующих статьях базы знаний Майкрософт:
251004 INF: Инструкции по наблюдению за блокировки SQL Server 7.0
271509 INF: Инструкции по наблюдению за блокировки SQL Server 2000
Ниже перечислены некоторые типичные характеристики компиляции блокировки, которые можно наблюдать в блокирующем выходного файла сценария.
  • lastwaittype SPID блокированные и блокирующие (обычно) является LCK_M_X (эксклюзивным) и waitresource имеет форму "ВКЛАДКУ: dbid.object_id [[COMPILE]],"где «object_id» — идентификатор объекта хранимой процедуры.
  • Блокировка окон с рекламой имеют waittype 0x0000 состояние runnable. У blockees waittype 0x000e (монопольная блокировка), состояние в спящем режиме.
  • Несмотря на то, что длительность блокировки происшествия может быть длинным, не существует не один SPID, блокирующих другие SPID в течение длительного времени. Нет чередующееся блокировки. Как только завершится одна компиляция, другой SPID берет на себя роль head всплывающих окон на несколько секунд или менее и т. д.
Ниже приведен из моментального снимка sysprocesses во время такого типа элемента Блокировка:
   spid  blocked  waittype  waittime  lastwaittype  waitresource
   ----  -------  --------  --------  ------------  -------------------------
   
   221    29      0x000e    2141      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   228    29      0x000e    2235      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    29   214      0x000e    3937      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    13   214      0x000e    1094      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    68   214      0x000e    1968      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   214     0      0x0000       0      LCK_M_X       TAB: 6:834102 [[COMPILE]]
В waitresourceИдентификатор базы данных — это столбец ("6:834102"), 6 и 834102 является идентификатором объекта. Имейте в виду, к которому принадлежит этот идентификатор объекта хранимой процедуры, не для таблицы (несмотря на тип блокировки «TAB»).

Заметки
  • При использовании SQL Server 2005, многие системные таблицы SQL Server 2000 реализованы как набор представлений. Эти представления известны как представления совместимости, и они предназначены только для обратной совместимости. Представления совместимости содержат метаданные, которые не были доступны в SQL Server 2000. Для получения дополнительных сведений о сопоставление системных таблиц SQL Server 2000 и системные представления SQL Server 2005 см. раздел «Сопоставление SQL сервера 2000 системы таблиц для SQL Server 2005 системных представлений» в электронной документации по SQL Server 2005.
  • Если имя хранимой процедуры начинается с префикса «sp_», а не в базе данных master, смSP: CacheMissПеред кэша, сбора данных для каждого выполнения даже если владелец уточняется хранимой процедуры. Это обусловлено тем, что префикс sp_ сообщает SQL Server, что хранимая процедура представляет собой систему хранимые процедуры и системные хранимые процедуры имеют другое имя правила разрешения. («Основной» находятся в основной базе данных.) Имена пользовательских хранимых процедур не должно начинаться с «sp_».
  • Если владельцем процедура выполняется с учетом регистра, чем процедуры с указанием владельца был создан как, можно получить процедуры с указанием владельцаCacheMiss или запрос блокировки COMPILE, но в конечном счете использовать кэшированный план. Таким образом это не будет реально перекомпиляции процедуры и не должна вызывать значительную нагрузку. Однако в некоторых случаях запрос блокировки COMPILE может привести к ситуации «блокирование цепи» при наличии многих SPID, попытка выполнить ту же процедуру, с учетом регистра, чем процедура была создана как. Это верно независимо от порядка сортировки или параметры сортировки, который используется на сервере или в базе данных. Причиной такого поведения является, что алгоритм, который используется для поиска в кэше процедура основана на хеш-значений (для повышения производительности), которые можно изменить, если случай отличается.

    Чтобы устранить проблему, удалите и создайте процедуру с так же как процедура выполняется приложением. Можно также удостовериться, что процедура выполняется из всех приложений, использующих одно и тоже.
  • При попытке выполнить хранимую процедуру как события языка вместо как RPC, SQL Server должен разбора и компиляции запроса событий языка, определяют, что запрос пытается выполнить конкретной процедуры и попытаться найти план в кэш-памяти для выполнения этой процедуры. Чтобы избежать такой ситуации, в которой SQL Server необходимо проанализировать и компиляции событий языка, убедитесь, что запрос отправляется к SQL как RPC.

    Дополнительные сведения содержатся в разделе «Системные хранимые процедуры» в электронной документации в статье «Создание хранимых процедур».


Известные проблемы

Ниже приведены некоторые известные проблемы, которые можно запретить кэширование плана.
  • Переменные типа BLOB используется в качестве параметра хранимой процедуры. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
    2380435 ИСПРАВЛЕНИЕ: План запроса хранимой процедуры не кэшируются, если хранимая процедура использует переменную типа BLOB, а переменная используется в функции строк в Microsoft SQL Server 2008
  • ОТКРЫТЬ СИММЕТРИЧНЫЙ ключ используется в пакете хранимой процедуры или запроса. Для получения дополнительных сведений см. следующую запись в блоге MSDN:
    http://blogs.MSDN.com/b/sqlserverfaq/Archive/2010/09/08/Open-SYMMETRIC-Key-Command-prevents-Query-PLAN-Caching.aspx

Свойства

Код статьи: 263889 - Последний отзыв: 5 июня 2011 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Ключевые слова: 
kbinfo kbmt KB263889 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:263889

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com