Возникновение этого вопроса на MSDN: Blocked-process-report: что это за ресурс ожидания "OBJECT: 32767: 124607697: 0 [COMPILE]"
Я поймал эти заявления в Profiler. Все они имеют продолжительность более 3 секунд. Некоторые старше 10 лет. Активность блокировки такая же, как и у ссылки из MSDN .
Все звонки используют 3 части именования. Все они указывают другой процесс в форме, они выглядят следующим образом:
exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL
exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL
exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL
exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL
Что я могу сделать, чтобы уменьшить этот уровень блокировки?
(изменить) Теперь я вижу то же самое для:
exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo'
Что-то происходит системно, но я не знаю, что еще делать. звонящий VB6 через ADO. Это ADO делает эти звонки.
Пример отчета о заблокированном процессе ниже
<blocked-process-report>
<blocked-process>
<process
id="process5bc1288"
taskpriority="0"
logused="0"
waitresource="OBJECT: 32767:124607697:0 [COMPILE]"
waittime="28887"
ownerId="11638114050"
transactionname="sqlsource_transform">
<executionStack>
<frame
line="1"
sqlhandle="0x000000000000000000000000000000000000000000000000">
<sqltext>EXEC [dbo].[spAlertDetectByPoll] ':V:^RMAlert^:Z:^&N&#RMAlert#&S&#L#&UID&#19#&AGN&#1#&DFC&#103#^', 1</sqltext>
</frame>
</executionStack>
<inputbuf>
SET NO_BROWSETABLE OFF </inputbuf>
</process>
</blocked-process>
<blocking-process>
<process
status="suspended"
waitresource="OBJECT: 32767:124607697:0 [COMPILE]"
waittime="35693"
spid="1121"
sbid="0"
ecid="0"
priority="0"
trancount="0"
lastbatchstarted="2013-12-16T14:45:48.960">
<executionStack>
<frame
line="1"
sqlhandle="0x000000000000000000000000000000000000000000000000" />
</executionStack>
<inputbuf>
SET NO_BROWSETABLE OFF </inputbuf>
</process>
</blocking-process>
</blocked-process-report>
sql-server-2008-r2
blocking
Дэн Холмс
источник
источник
Ответы:
Существует отличное сообщение в блоге http://blogs.msdn.com/b/support_sql_france/archive/2012/02/07/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx, в котором объясняется, что происходит.
SQL Server допускает заданное количество компиляций в зависимости от их сложности. Он группирует их на маленькие, средние и большие. Для больших компиляций может быть только один скомпилированный за раз, так что, скажем, все ваши процессы считаются большими, тогда каждый должен компилироваться последовательно. Это может объяснить блокировку.
Я думаю, что может быть несколько подходов к проблеме - рассмотреть больше ресурсов (большее количество процессоров позволит выполнять больше мелких и средних запросов или может повысить порог для того, что считается средним). Кроме того, больше памяти может решить проблему.
Если вы похожи на большинство из нас, это может быть невозможно. Другой вариант может состоять в том, чтобы просмотреть вызовы ADO и посмотреть, можно ли уменьшить или распределить количество вызовов, чтобы не все вызовы происходили одновременно. Сокращение числа в любой момент времени должно сократить время ожидания.
Если это не сработает, попробуйте исправить «скомпилируемость» хранимых процедур. Возможно, разбейте их на более мелкие фрагменты, которые могут уменьшить их до небольших или средних сегментов и разрешить больше параллельных компиляций. Или определите, почему нужно каждый раз перекомпилировать процы. Посмотрите, можно ли их переписать так, чтобы их не нужно было перекомпилировать. Наконец, я хотел бы рассмотреть возможность использования Руководства по плану. Это позволит предварительно скомпилировать процесс и сэкономить время.
надеюсь, это поможет
источник