172ポイント
206 投稿 奇妙な Cmd.ExecuteReader のパフォーマンスの問題 23 時間 8 分前|LINK
構築される次のクエリがあります。
SELECT TOP 14 DocumentId
FROM idx1_AuthLetters
a INNER JOIN Documents b ON a.DocumentId = b.Id
WHERE Status in ('L','S','V')
AND ServiceCenter = 'NC'
AND mem_name like '%ZZZ%'
ORDER BY DOCUMENTID
これを Sql Server Management Studio クエリ ウィンドウで実行すると、一瞬実行されます。とても早い。
このクエリでは、0 レコードが返されます。
問題は、このクエリを動的に構築していることです。したがって、クエリを実行する直前にブレーク ポイントを設定し、cmd オブジェクトを調べると、次のようになります。
SELECT TOP 14 DocumentId
FROM idx1_AuthLetters a
INNER JOIN Documents b ON
a.DocumentId = b.Id
WHERE Status in ('L','S','V')
AND ServiceCenter = @1
AND mem_name like @2
ORDER BY DOCUMENTID
パラメータ値は次のとおりです。
@1: NC
@2: %ZZZ%
面白いことに、0 レコードではなく、返されたレコードがある場合は、すべて正常に動作します。
例として、異なるパラメーター値を使用して構築された同じクエリがあります。
SELECT TOP 14 DocumentId
FROM idx1_AuthLetters a
INNER JOIN Documents b
ON a.DocumentId = b.Id
WHERE Status in ('L','S','V')
AND ServiceCenter = @1
AND mem_name like @2
ORDER BY DOCUMENTID
@1: NC
@2: %JOHN%
これは最近の問題です。以前は両方のテスト ケースが正常に機能していましたが、返されたレコードが 0 になり、cmd.ExecuteReader() 行がタイムアウトになりました。
また、Oracle でも同じ問題があります。タイムアウトはしませんが、Oracle バージョンでは少し遅いだけです。
Oracle で 0 レコードを返すこのクエリには 11 秒かかりますが、レコードを含むクエリでは 0 または 1 秒かかります。
何が原因でしょうか?