web-dev-qa-db-ja.com

SQL Server 2008で最もパフォーマンスの低いクエリを見つける方法は?

SQL Server 2008で最もパフォーマンスの低いクエリを見つける方法は?

次の例を見つけましたが、機能していないようです。

SELECT TOP 5 obj.name, max_logical_reads, max_elapsed_time
FROM sys.dm_exec_query_stats a
CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd
INNER JOIN sys.sysobjects obj on hnd.objectid = obj.id
ORDER BY max_logical_reads DESC

から取得:

http://www.sqlservercurry.com/2010/03/top-5-costly-stored-procedures-in-sql.html

16
Thomas Bratt

に基づくトップ10の最悪のクエリ...:

SELECT TOP 10
    total_worker_time/execution_count AS Avg_CPU_Time
        ,execution_count
        ,total_elapsed_time/execution_count as AVG_Run_Time
        ,(SELECT
              SUBSTRING(text,statement_start_offset/2,(CASE
                                                           WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 
                                                           ELSE statement_end_offset 
                                                       END -statement_start_offset)/2
                       ) FROM sys.dm_exec_sql_text(sql_handle)
         ) AS query_text 
FROM sys.dm_exec_query_stats 

--pick your criteria

ORDER BY Avg_CPU_Time DESC
--ORDER BY AVG_Run_Time DESC
--ORDER BY execution_count DESC
26
KM.

This MSDN Magazineの記事は、このトピックに関する優れた情報を提供します。

6
Ivan Zlatanov

実行時間で最もパフォーマンスの低いクエリを見つけたい場合は、次を使用します。

SELECT *
FROM sys.dm_exec_query_stats a
CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd
ORDER BY total_elapsed_time/execution_count DESC

ただし、「最悪の」クエリを見つけるには、多くの場合、exec_query_statsDMVをもう少し詳しく調べる必要があります。考慮すべきことがたくさんあります:

  1. 上記のクエリが生成する時間による最悪の個々のクエリ。
  2. total_worker_time/execution_countで並べ替える最悪のCPUホッグ(CPUが不足している場合)
  3. 最も多くの読み取りを行うクエリ。多くの場合、最も時間がかかるクエリです。

これらのクエリは、パフォーマンスが低いクエリを強調表示しますが、多くの場合、「公正な」パフォーマンスのクエリがありますが、頻繁に呼び出されるため、アプリの全体的なパフォーマンスが低下します。これらを見つけるには、上記のクエリをtotal_elapsed時間(またはtotal_[whatever metric you are interested in])で並べ替え、execution_countで除算しないでください。

4
Matt Wrock

SQLプロファイラーでパフォーマンスの遅いクエリを見つける

  • SQLプロファイラーを起動します(できればライブデータベースで)。
  • ファイル->新しいトレース
  • SQLサーバーを選択します
  • タブフィルター
  • オプションで、データベース名にフィルターを設定します
  • プロファイラーを起動します(RUN)
  • 結果を次のようなテーブルに保存します。_Mytrace、できれば、まだ多くのことを行っていないデータベースサーバーに保存します。
  • 選択したクエリをフィルタリングする
  • 期間で注文する
  • このクエリの実行計画を確認してください
3
Ivo