SQLServerデータベースに接続し、「プロパティ」に対して約360のクエリを実行し、そのデータを「cProp」と呼ぶ.Netオブジェクトとして返す、シンプルな「クライアント」アプリを作成しました。
クエリは複雑さが異なりますが、非常に長い時間がおそらく400ミリ秒かかります。最近60のプロパティで実行したところ、実行全体に約3分かかりました。お客様は、データベースをリモートサーバーに移動することを決定しました。その結果、同じクエリでは51分かかりました。
現在、問題は行の取得にあると99%確信していますが、それを証明する必要があります。 DBAはプロセスを追跡しましたが、それを以前に使用したことがなかったため、プロセスに含まれている情報が少ないことを知り、私はがっかりしました。私が見たのは、サーバー時間がわずか4分未満であるということです。これは、問題が行の取得にあるという私の信念を強めます。
しかし、それをどのように測定しますか?トレースは行数や合計データサイズについて何も返しません-私はそれを間違っていますか?また、バッチ処理はサーバーの外部で行われることも知っています。そこで、そこで何が行われているのかを知るにはどうすればよいですか一般的に言えば、いわば「サーバーの外」で起こっている問題をいかにデバッグするかです。
ここでいくつかの数学を明確にするために:
したがって、最善のケースでは、1秒あたりのスループットが平均120クエリになります。
SQL Serverをpingレイテンシが65ミリ秒の場所に移動すると、平均して1秒あたり7クエリになります。
あなたの最善の策は
説明に基づいて、おそらく ASYNC_NETWORK_IO waits が表示されます。これはcanはネットワーク転送が遅いことを示します。しかし、通常、これはクライアントアプリケーションが行ごとの処理を行っており、SQL Serverが行を送信するのを待っていることを意味します(ネットワーク上で可能な限り高速に行を実行したい場合)。
関連する注意-一般的に、21,000のクエリを実行して(潜在的に遅い)ネットワーク上で21,000のラウンドトリップを行うよりも、より大きなデータの「グループ」をプルしようとする方がはるかに効果的です。 これは「チャット」インターフェースまたはAPIと呼ばれ、 一般にアンチパターンと見なされます です。
65ms * 21,600クエリが1,404,000 ms、AKAの23分のオーバーヘッドであると考えてください。これは、ラウンドトリップの数を制限するだけで取り除くことができる、耳にした大きなチャンクです。
クエリがSQLサーバーから再実行するのにかかる時間をテストする別の方法は、 Test-DbaNetworkLatency を使用することです。
例えば.
Test-DbaNetworkLatency -SqlInstance sqlserver2014a、sqlcluster、sqlserver -Query "select top 10 * from otherdb.dbo.table" -Count 10
Windows資格情報を使用して、sqlserver2014a、sqlcluster、およびsqlserverで「select top 10 * from otherdb.dbo.table」の実行結果の戻りを10回テストします。 -sqlCredential
を使用して、SQL credsを上記のコマンドに渡すことができます。
典型的な出力(マイナスサーバー名は以下のようになります):
>
ExecutionCount : 10
Total : 340.77 ms
Average : 34.08 ms
ExecuteOnlyTotal : 246.72 ms
ExecuteOnlyAverage : 24.67 ms
NetworkOnlyTotal : 94.05 ms