2

クエリの実行時にデータベースから返されるデータのバイト単位のサイズを取得するにはどうすればよいですか? これは、2 つの異なる手法を使用してデータベース サーバーの負荷を比較するためです。すべてのレポートのデータセット全体を読み込む同じデータセットから作成されたレポートを実行していました。現在、データセットをキャッシュして、キャッシュからレポートを実行しています。クライアントごとにレポートを実行しますが、一部のデータセットは他のデータセットよりも大幅に大きく、データベース サーバーの負荷を軽減するための測定可能なメトリックを提供する方法が必要です。

既存の機能について DbConnection、DbDataReader、および DbCommand を調べてみましたが、見つかりませんでした。可能であれば、特定の接続またはリーダーのデータ スループットを測定することは素晴らしいことですが、どのような解決策も受け入れられます。測定に使用できるデータベース サーバー プロキシはありますか?

データベースは Oracle 10g です。

4

4 に答える 4

3

1つの可能性は、単にネットワークスニファを使用することです。Wiresharkは驚くほど優れています。接続ごとに測定するのは難しいですが(特定のマシンで複数の接続を使用する場合)、クライアントマシンとの間のすべてのトラフィックを測定するために使用できます。これの利点の1つは、送信要求も測定することです。これは、状況(レポート生成)では小さいはずですが、それでも全体的な負荷の一部です。

この方法で測定することのもう1つの利点は、行われる要求のサイズに違いがある場合はそれを検出できることです。たとえば、1つのメソッドでサーバーから個別のリクエストで個々のレコードが読み取られ、もう1つのメソッドでレコードの「バッチ」が1つのリクエストで読み取られる場合、それらの違いを確認できます。この場合の両方の方法は、DbDataReaderレベルの合計データが同じであることを示している可能性がありますが、最初の方法では、ネットワークトラフィックが大幅に増加します。

Wiresharkは、これに役立つ可能性のある多くの統計を示しています。パケットの総数、パケットの平均サイズ、合計サイズ、1秒あたりの平均バイト数などを指定できます。

于 2010-03-06T00:53:47.890 に答える
2

データベース側で測定してみましたか?Oracle 10g には、さまざまなパフォーマンス チューニング ツールと監視ツールが備わっているようです。

于 2010-03-07T14:11:49.890 に答える
0

これを行う簡単な方法はないと思います。メタデータを取得するには、すべてのキー、列、およびメタデータが全体として表されるように、データを DbDataReader または DataRow ではなく DataSet または DataTable として表す必要があります。

バイナリ フォーマッタとメモリ ストリームを作成し、DataSet/DataTable をバイナリ データとしてメモリ ストリームにシリアル化します。その後、ストリームから長さを要求できるはずです。これにより、質問に投稿されたデータのサイズが非常に正確にわかるはずです

これはおそらくパフォーマンス キラーなので、データのサイズを理解するためだけにデバッグ環境で使用することをお勧めします。

于 2010-03-08T22:44:16.040 に答える
0

結果セット全体をループする以外は、結果セットのサイズを取得できません。プリフォームの観点から余裕がない場合は、結果セットの最初の行でサーバーから結果セットのサイズを返すことができます。または 2 つの結果セットを返します。

于 2010-03-02T18:42:44.017 に答える