sp_procedure_params_90_rowsetでの過度のコンパイルブロッキング


14

MSDNでのこの質問の復活:Blocked-process-report:このwaitresourceとは何ですか "OBJECT:32767:124607697:0 [COMPILE]"

プロファイラーでこれらのステートメントをキャッチしました。それらはすべて3秒以上の持続時間を持っています。いくつかの10以上。ブロックアクティビティは、MSDNからのリンクと同じです。

呼び出しはすべて3つの部分の命名を使用します。すべては、次のような形式で異なるprocを指定します。

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'

体系的な何かが起こっていますが、他に何をすべきかわかりません。呼び出し元はADOを介したVB6です。これらの呼び出しを行うのは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:^&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>

SQL Server 2008 R2の最新のサービスパックと累積的な更新プログラムがインストールされていますか?
マックスヴァーノン

SP2 CU4 Microsoft SQL Server 2008 R2(SP2)-10.50.4270.0(X64)
ダンホームズ

これいつ始まったのですか?最近、Service Packまたは累積的な更新プログラムを適用しましたか?また、VB6 / ADOをサポートしています。これらのシステムプロシージャが1、2回現れるのを思い出しますが、ブロッキングの問題はないと思います。彼らは非常に頻繁に呼ばれているので、彼らが思いついたと思います。私たちはまだ10.50.2500を使用しているため、これがSP / CU関連ではないことを祈ります。これらがそれぞれ3〜10秒かかった場合は死に至ります。
ジョンセイゲル

それがpastbinに多くのものを置くpastebin.com/4wUgzby9。これは約2週間または3週間続いています。長い間CUを適用していません。MSDN投稿で日付が付けられたように、2012年初頭に初めて発生しました。
ダンホームズ

1
これは単なる症状かもしれません。RESOURCE_SEMAPHORE_QUERY_COMPILEの定期的な待機アクティビティがあります。ここで私が見つけたこのwaittypeの最良の治療法です: blogs.msdn.com/b/support_sql_france/archive/2012/02/07/...
ダン・ホームズ

回答:


2

素晴らしいブログ記事があります http://blogs.msdn.com/b/support_sql_france/archive/2012/02/07/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx で何が説明されていますハプニング。

SQL Serverでは、複雑さに基づいて一定数のコンパイルが可能です。それらを小、中、大にグループ化します。大規模なコンパイルの場合、一度にコンパイルできるのは1つだけです。したがって、すべてのprocが大きいと見なされ、それぞれを順次コンパイルする必要があるとします。それがブロッキングの原因になる可能性があります。
この問題にはいくつかのアプローチがあると思います-より多くのリソースを検討してください(CPUを増やすと、中小規模のクエリをより多く並行して実行できるようになります。また、メモリを増やすと問題が解決する場合があります。

あなたが私たちのほとんどと同じなら、それは不可能かもしれません。別のオプションは、ADO呼び出しを確認し、すべての呼び出しが同時に発生しないように呼び出しの数を削減または分散できるかどうかを確認することです。任意の時点で数を減らすと、待ち時間が短くなります。

それでもうまくいかない場合は、ストアドプロシージャの「コンパイル可能性」を修正することを検討してください。それらを小さなチャンクに分割すると、小さなバケットまたは中程度のバケットに縮小され、より多くの並列コンパイルが可能になる場合があります。または、毎回procを再コンパイルする必要がある理由を判断します。再コンパイルする必要がないように書き換えられるかどうかを確認します。最後に、プランガイドの使用を検討します。これらにより、プロシージャをプリコンパイルでき、時間を節約できます。

役立つことを願っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.