環境:
SQL Server 2005を実行している2つの32ビットWindows Server 2003 R2マシンがあります。ハードウェア構成は、Xeon 5160 CPU、4GB RAM、13GB RAID0を備えた同一サーバーです。AWEおよび/ 3GBフラグは有効ではありません。
サーバーは、事前に定義されたインストールチェックリストを使用して並列にセットアップされ、インストールされたすべてのソフトウェアは両方のマシンで同じです。
確認する必要があるSQLサーバーのインストール設定とパッチレベルはすべて同じです。1つの違いは、TEMPDBが高速マシンで400MB、低速マシンで1.2GBであることです。ただし、どちらの場合も、TEMPDBの割り当ては行われていません。
問題:
一方では2秒、もう一方では15分で実行されるストアドプロシージャがあります。追加の15分間、ディスクアクティビティはほとんどないか、メモリ使用量は変化しませんが、1つのCPUコアが常に100%に固定されます。
この動作は、データベースが一方からバックアップされ、他方に復元された場合でも持続します。
これはストアドプロシージャであるため、アクティビティモニタとプロファイラは、ストアドプロシージャのどこでこの高CPUアクティビティが発生しているかについての詳細を表示しません。
質問:
他に何を見るべきでしょうか?
ファローアップ:
スローは、次のカーソル定義のFETCH NEXTステートメントで発生します。
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
各FETCHステートメント(約1000行のみを含むテーブル)では、約7.25分が必要です。(いいえ、なぜ2つ続けて行われるのかわかりません。開発者に尋ねる必要がありますが、両方のサーバーで正しく実行されます)。
Virtual Readsが本当に高いように見えるので、私はその「NOT IN(SELECT ...)」について少し疑っています。