XEイベントからデータを収集したときに、以下のクエリのパフォーマンスを理解できません。
クエリ
DECLARE @Importdate DATETIME = ISNULL ((
SELECT ImportDatetime
FROM
Customertable
where CustomerID = 1
and OrderID =1
) , '01/01/2000')
ステートメントのこの部分は1行だけを返します
SP statement completed
は40秒を示します
RPC Completed
上記のステートメントの場合64秒
RPCがこのような大きな違いを示す理由と、この問題を探す場所を理解するのに助けが必要ですか?そのように報告されたNWの問題はありませんが、ここで何が示され、上記のように単純なクエリはその実行時間に対して高いようです
アドバイスをお願いします
まず、次のように述べます。
はい、これはストアドプロシージャのステートメントの一部です。
これはストアドプロシージャの唯一のステートメントですか?テストすれば不可能ではありませんが、そうでなければ、変数を設定してそれを使用したり、他のことをしたりしないストアドプロシージャがあると、奇妙に思えます。では、ストアドプロシージャの他のステートメントについてはどうでしょうか。すべての時間を考慮したことがありますか?
RPC:Starting
—プロシージャを実行するためのリモートプロシージャコール(つまり、アドホッククエリバッチではありません)SP:Starting
—ストアドプロシージャが開始します(キャッシュにない場合、コンパイルに時間がかかります)SP:StmtStarting
SP:StmtCompleted
SP:Completed
RPC:Completed
レイテンシを確認する場合は、必ずEndTime
をキャプチャして、次の値を比較してください。
SP:StmtCompleted
およびSP:Completed
SP:Completed
およびRPC:Completed
SP:StmtCompleted
とSP:Completed
の間の予想される時間差よりも大きく表示されます。さもないと:
SP:Starting
のEndTime
と最初のSP:StmtStarting
のStartTime
の間の差。次に、私たちは本当にここで数秒について話しますか? 2つのSELECT
(または類似の)述部が与えられた単一の列のINT
に40秒か?インデックスがなくても、alotの競合がないか、テーブルに数十億行あるか、またはそのようなものでない限り、そのようなクエリは40秒のかなり前に返されると思います。間違った数で割った可能性はありますか? 1000000
で除算する必要があると思います。これらの数値が正しければ、その単純なSELECT
が40秒かかるのは、他の何が残りの24秒を占めるのかよりも、もっと心配になります。
一般的に言えば rpc_completedにはネットワーク時間が含まれますが、sp_statement_completedには含まれません 。クエリは1行しか返さないため、これはクエリの場合によくあることです。
そのため、ネットワーク経由でクライアントにデータを送信するために余分な時間が費やされていることが1つの説明です。
このクエリの待機統計を測定して、違いを説明するASYNC_NETWORK_IO待機が24秒あることを確認できます。
サーバーにSSMSがインストールされている場合は、リモートデスクトップからサーバーにクエリを実行できます。ネットワークの待機時間はほとんどありません。この場合、このステートメントのこれら2つのイベントの時間にはほとんど違いがありません。