私はSQLServerプロファイラーを頻繁に使用して、冗長なクエリやパフォーマンスの悪いクエリをチェックしています。
しかし、データベースからアプリケーションにデータを転送するのにかかる合計時間をログに記録できるイベント(巨大なリストの中に)はありますか?
これは、アプリケーションで必要とされるよりもはるかに多くのデータを返すクエリの非常に優れた指標になります。
私はSQLServerプロファイラーを頻繁に使用して、冗長なクエリやパフォーマンスの悪いクエリをチェックしています。
しかし、データベースからアプリケーションにデータを転送するのにかかる合計時間をログに記録できるイベント(巨大なリストの中に)はありますか?
これは、アプリケーションで必要とされるよりもはるかに多くのデータを返すクエリの非常に優れた指標になります。
データがSQLServerを離れると、ハードウェア(NICとネットワーク遅延)に翻弄されます。
通常、クライアント側からプロファイルを作成します。
SQLプロファイラーを使用して、クエリによって実行された読み取りの数を監視します。これは良い指標です。通常、を使用するクエリ'SELECT *'
はカバーインデックスを使用できないため、ブックマークルックアップを探します。
大きな結果セットを返すクエリを特定したいと思っているように思えます。これをさらに深くして、本当にやりたいことは、どのクエリが最大量のデータを消費しているかを特定することです。これは、論理読み取りと物理読み取りの両方の観点から見ることができます。
レポートでこの情報を表示するには、無料で入手できるパフォーマンスダッシュボードレポートを使用するか、SQLServerDMVを使用できます。
たとえば、次のクエリは、 GlennBerryによる優れたSQLServerパフォーマンスブログから取得されました。
/* Top Cached SPs By Total Logical Reads (SQL 2008). Logical reads relate to memory pressure */
SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads],
qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count,
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second],
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_logical_reads DESC;