ここ数週間、サーバーで進行中の問題と戦っています。いくつかの異なるストアド プロシージャで実行される単純なクエリがありますが、そのうちのいくつかでは、クエリの実行に 4 分近くかかる場合があります。一部のプロシージャには、これとまったく同じクエリがあり、1 秒未満で実行されます。クエリ ウィンドウから実行すると、1 秒未満で戻ります。
これを再現できません - ユーザーが実行している手順を実行できません (データが変更されるため)。テスト サーバーでは問題は発生しません。実行計画を再作成しているように見えるプロシージャを再コンパイル (F5) して、しばらく修正することもできますが、常に戻ります。
クエリは次のように単純です。
SELECT '1'
FROM TRANSACTION_LOG WITH (NOLOCK)
WHERE TYPE = 15 AND SERIAL_NO = @P_TRAVELER_SERIAL
TRANSACTION_LOG
〜90m行ありますTYPE
非クラスター化インデックスがあるSERIAL_NO
非クラスター化インデックスがある
いくつかの調査とプロファイラによるキャプチャの後、実行計画に奇妙な点が見つかりました。実行計画が速く実行されているときと、実行が遅いときの別の実行計画をキャプチャすることができました。これらは、まったく同じ手順、まったく同じクエリからのものです。唯一の違いは、@P_TRAVELER_SERIAL
パラメーターの値です。
速い:
Compute Scalar(DEFINE:([Expr1005]=CASE WHEN [Expr1006] THEN (1) ELSE (0) END))
|--Nested Loops(Left Semi Join, DEFINE:([Expr1006] = [PROBE VALUE]))
|--Constant Scan
|--Filter(WHERE:([MICS].[dbo].[Transaction_Log].[TYPE]=(15)))
|--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000], [Expr1010]) WITH UNORDERED PREFETCH)
|--Index Seek(OBJECT:([MICS].[dbo].[Transaction_Log].[IX_SERIAL_NO]), SEEK:([MICS].[dbo].[Transaction_Log].[SERIAL_NO]=[@P_TRAVELER_SERIAL]) ORDERED FORWARD)
|--RID Lookup(OBJECT:([MICS].[dbo].[Transaction_Log]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD)
スロー:
Compute Scalar(DEFINE:([Expr1005]=CASE WHEN [Expr1006] THEN (1) ELSE (0) END))
|--Nested Loops(Left Semi Join, DEFINE:([Expr1006] = [PROBE VALUE]))
|--Constant Scan
|--Table Scan(OBJECT:([MICS].[dbo].[Transaction_Log]), WHERE:([MICS].[dbo].[Transaction_Log].[TYPE]=(15) AND [MICS].[dbo].[Transaction_Log].[SERIAL_NO]=[@P_TRAVELER_SERIAL]))
1 つのプランでインデックス シークを使用し、もう 1 つのプランでテーブル スキャンを使用するのはなぜですか? 同じクエリで同じ手順ですか?テーブルのアクティビティはそれと関係がありますか? 賑やかな食卓です…
ありがとう