1

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 秒かかります。

何が原因でしょうか?

4

2 に答える 2

0

SQL Server Management Studio には、実行計画の視覚化と呼ばれる優れた機能があります。実行計画を使用してクエリを実行すると、クエリがサーバー上でどのように処理されるかを (文字通り) 把握できます。テーブル スキャンでネストされたループを探します。

これは通常、インデックスが作成されていない、または不適切にインデックスが作成されているデータベースの問題ですが、データベース構造に関する追加情報がなければ、誰も適切に解決できないと思います。

編集: .Net コードから DB にアクセスしたときにのみ問題が発生する場合は、SQL Server プロファイラー (Management Studio -> Tools -> SQL Server Profiler) を利用し、DB でトレースを開始してから、クライアントでクエリを実行する必要があります。プロファイラー トレースは、実行される実際のクエリを表示し (params のために少し編集する必要がある場合があります)、そのクエリを実行プランで使用します。

于 2013-07-24T13:20:39.843 に答える