sql >> データベース >  >> RDS >> Sqlserver

最も高価なクエリをログに記録して見つけるにはどうすればよいですか?

    1. SQL Server Profiler(SSMSのツールメニュー)を使用して、これらのイベントをログに記録するトレースを作成します。

       RPC:Completed
       SP:Completed
       SP:StmtCompleted
       SQL:BatchCompleted
       SQL:StmtCompleted
      
    2. 標準のトレーステンプレートから始めて、それを整理することができます。これが特定のデータベース用かサーバー全体用かを指定しませんでした。特定のDb用の場合は、DatabaseID列を含め、DBにフィルターを設定します(SELECT DB_ID('dbname') )。各イベントに論理読み取りデータ列が含まれていることを確認してください。ファイルにログを記録するようにトレースを設定します。このトレースをバックグラウンドで無人で実行するために残しておく場合、十分なスペースがある場合は、トレースファイルの最大サイズを500MBまたは1GBに設定することをお勧めします(サーバーでのアクティビティの量によって異なります)。あなたはそれを吸って見る必要があります。

    3. トレースを簡単に開始してから一時停止します。 [ファイル]->[エクスポート]->[スクリプトトレース定義]に移動し、DBバージョンを選択して、ファイルに保存します。これで、プロファイラーGUIを介して実行するよりもはるかに少ないオーバーヘッドでトレースを作成するSQLスクリプトができました。このスクリプトを実行すると、トレースID(通常は@ID=2)が出力されます。 );これを書き留めてください。

    4. トレースファイル(.trc)を取得したら(最大ファイルサイズに達したためにトレースが完了したか、

      を使用して実行中のトレースを停止しました

      EXEC sp_trace_setstatus @ ID、0
      EXEC sp_trace_setstatus @ ID、2

    トレースをプロファイラーにロードするか、ClearTrace(非常に便利)を使用するか、次のようにテーブルにロードできます。

    SELECT * INTO TraceTable
    FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)
    

    次に、クエリを実行して、次のようなデータを集約できます。

    SELECT COUNT(*) AS TotalExecutions, 
        EventClass, CAST(TextData as nvarchar(2000))
     ,SUM(Duration) AS DurationTotal
     ,SUM(CPU) AS CPUTotal
     ,SUM(Reads) AS ReadsTotal
     ,SUM(Writes) AS WritesTotal
    FROM TraceTable
    GROUP BY EventClass, CAST(TextData as nvarchar(2000))
    ORDER BY ReadsTotal DESC
    

    コストのかかるクエリを特定したら、実際の実行計画を生成して調べることができます。



    1. クエリを使用してVIEWddlを取得する

    2. MySQLer向けのPostgreSQLトレーニング

    3. MySQLの複数のテーブルからのCOUNT(*)

    4. MySQLで過去10分間のレコードを取得する方法