Sebuah kebangkitan dari pertanyaan ini pada MSDN: Blocked-process-report: apa sumber daya menunggu ini "OBJECT: 32767: 124607697: 0 [COMPILE]"
Saya telah menangkap pernyataan ini di Profiler. Mereka semua memiliki durasi lebih dari 3 detik. Lebih dari 10+. Aktivitas pemblokiran sama dengan tautan dari MSDN .
Panggilan semua menggunakan penamaan 3 bagian. Semua menentukan proc yang berbeda dalam bentuk mereka terlihat seperti berikut:
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
Apa yang bisa saya lakukan untuk mengurangi tingkat pemblokiran ini?
(sunting) Saya sekarang melihat hal yang sama untuk:
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'
Ada sesuatu yang sistemik terjadi tetapi saya tidak tahu harus berbuat apa lagi. penelepon adalah VB6 via ADO. ADO membuat panggilan ini.
Contoh laporan proses yang diblokir ada di bawah ini
<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
dan holmes
sumber
sumber
Jawaban:
Ada posting blog yang sangat bagus http://blogs.msdn.com/b/support_sql_france/archive/2012/02/07/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx yang menjelaskan apa kejadian.
SQL Server memungkinkan sejumlah kompilasi berdasarkan kompleksitasnya. Ini mengelompokkan mereka menjadi kecil, sedang, dan besar. Untuk kompilasi besar, hanya ada satu kompilasi pada satu waktu, jadi katakanlah semua procs Anda dianggap besar, maka masing-masing harus dikompilasi secara serial. Itu bisa menjelaskan pemblokiran.
Saya pikir mungkin ada beberapa pendekatan untuk masalah ini - pertimbangkan lebih banyak sumber daya (lebih banyak CPU akan memungkinkan lebih banyak permintaan kecil dan menengah yang bersamaan atau dapat naik ambang batas untuk apa yang dianggap sedang). Selain itu, lebih banyak memori dapat menyelesaikan masalah.
Jika Anda seperti kebanyakan dari kita, itu tidak mungkin. Pilihan lain mungkin untuk meninjau panggilan ADO dan melihat apakah jumlah panggilan dapat dikurangi atau menyebar sehingga tidak semua panggilan terjadi pada saat yang sama. Mengurangi nomor pada waktu tertentu harus mengurangi waktu tunggu Anda.
Jika itu tidak berhasil, pertimbangkan untuk memperbaiki 'kompilasi' dari procs yang disimpan. Mungkin memecahnya menjadi potongan-potongan kecil yang mungkin mengurangi mereka ke ember kecil atau sedang dan memungkinkan kompilasi yang lebih paralel. Atau tentukan mengapa procs perlu dikompilasi ulang setiap kali. Lihat apakah mereka dapat ditulis ulang sehingga mereka tidak perlu dikompilasi ulang. Akhirnya, saya akan mempertimbangkan menggunakan Panduan Rencana. Ini akan memungkinkan procs dikompilasi dan dapat menghemat waktu.
Semoga itu bisa membantu
sumber