Memblokir kompilasi berlebihan pada sp_procedure_params_90_rowset

14

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:^&amp;N&amp;#RMAlert#&amp;S&amp;#L#&amp;UID&amp;#19#&amp;AGN&amp;#1#&amp;DFC&amp;#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>
dan holmes
sumber
Apakah Anda memiliki paket layanan terbaru dan pembaruan kumulatif yang diinstal untuk SQL Server 2008 R2?
Max Vernon
SP2 CU4 Microsoft SQL Server 2008 R2 (SP2) - 10.50.4270.0 (X64)
dan holmes
Kapan ini mulai terjadi? Apakah Anda baru-baru ini menerapkan Paket Layanan atau Pembaruan Kumulatif? Saya juga mendukung VB6 / ADO dan saya ingat melihat procs sistem ini muncul sekali atau dua kali, tetapi saya tidak berpikir ada masalah pemblokiran. Saya pikir mereka datang karena mereka sering dipanggil. Saya berdoa ini tidak terkait SP / CU karena kita masih di 10.50.2500, dan itu akan menjadi kematian jika hal-hal ini mulai memakan waktu masing-masing 3-10 detik.
Jon Seigel
itu menempatkan salah satu dari banyak ke pastbin pastebin.com/4wUgzby9 . ini telah berlangsung sekitar 2 atau 3 minggu. Kami sudah lama tidak menerapkan CU. Itu terjadi pada awal 2012 pertama kali seperti tanggal oleh posting MSDN.
dan holmes
1
ini mungkin hanya gejalanya. Saya memiliki aktivitas menunggu reguler di RESOURCE_SEMAPHORE_QUERY_COMPILE. Berikut ini pengobatan terbaik dari waittype yang saya temukan: blogs.msdn.com/b/support_sql_france/archive/2012/02/07/…
dan holmes

Jawaban:

2

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

paulbarbin
sumber