1

私が使用(および更新)するレポートには時間がかかります(数時間かかる場合もあります)。これは長すぎると感じ、以前にこれについて尋ねました。SQLのパフォーマンスについて説明しているさまざまなWebサイトを詳しく調べた後、それらはすべてDBAであるというスタンスを取ります。しかし、私はそうではなく、同僚もそうではありません(DBAがあれば、この問題は発生しないと思います)。

私が欲しいのは、実行回数が最も多く、パフォーマンスが最も低い上位10個程度のスクリプトを返す簡単な方法です。素敵なSETMETRICSONスイッチがあるといいのですが、そうだとしたら、サイトはプロファイルの記録を続けないでしょう。

私がしたい最後のことは、パフォーマンスをさらに低下させることであり、プロファイルを記録することはパフォーマンスキラーのように聞こえます。

4

2 に答える 2

1

少なくとも次のオプションがあります。

  • SQLアナライザーでパフォーマンスの悪いクエリの計画を見て、そこからクエリごとに最適化してみてください。
  • またはスクリプト (以下を参照) を使用して、作成できるインデックスに関する SQLServer の統計を分析し、アドバイスを提供します。
  • または、データベース エンジン チューニング アドバイザーを使用して、クエリを高速化するためのインデックスを提案または作成します。
  • または、redgate の SQL Response のようなツールを使用して、消化しきれないほどの情報を提供します。

最終的には、自動化されたツールがあなたを大いに助けてくれます。あなたのケースではそれで十分かもしれませんが、自動化されたツールはクエリを書き換えることができないという事実だけで、熟練した DBA よりも優れたパフォーマンスを発揮できる自動化されたツールはないことに注意してください。


SET CONCAT_NULL_YIELDS_NULL OFF
--Joining the views gives a nice picture of what indexes 
--would help and how much they would help
SELECT 
  'CREATE INDEX IX_' + UPPER(REPLACE(REPLACE(COALESCE(equality_columns, inequality_columns), '[', ''), ']', ''))
    + ' ON ' + d.statement + '(' + COALESCE(equality_columns, inequality_columns) 
  + CASE WHEN equality_columns IS NOT NULL THEN  
        CASE WHEN inequality_columns IS NOT NULL THEN ', ' + inequality_columns 
        END END 
    + ')' + CASE WHEN included_columns IS NOT NULL THEN ' INCLUDE (' + included_columns + ')' END
  , object_name(object_id)
  , d.*
  , s.*
FROM    sys.dm_db_missing_index_details d 
      LEFT OUTER JOIN sys.dm_db_missing_index_groups g ON   d.index_handle = g.index_handle
      LEFT OUTER JOIN sys.dm_db_missing_index_group_stats s ON  g.index_group_handle = s.group_handle
WHERE   database_id = db_id()
ORDER BY avg_total_user_cost DESC
于 2009-06-05T12:16:49.577 に答える
1

データベースに対するすべてのクエリに関する情報を保持する sys.dm_exec_query_stats テーブルを通過できるはずです。

SELECT  creation_time  
    ,last_execution_time 
    ,total_physical_reads
    ,total_logical_reads  
    ,total_logical_writes
    , execution_count 
    , total_worker_time
    , total_elapsed_time 
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
     ((CASE statement_end_offset 
      WHEN -1 THEN DATALENGTH(st.text)
      ELSE qs.statement_end_offset END 
        - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY last_execution_time,total_elapsed_time / execution_count DESC;

過去にクエリにかかった時間の基本的なタイミング情報を提供します。

于 2009-06-05T12:28:42.530 に答える