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

SQLServer2008のCPU使用率が高い

    DMVを使用して、コストのかかるクエリ(およびそれらが関連付けられているデータベース)を特定できます。 このTechNet記事から :

    SELECT TOP 50
     [Average CPU used] = total_worker_time / qs.execution_count,
     [Total CPU used] = total_worker_time,
     [Execution count] = qs.execution_count,
     [Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
             (CASE WHEN qs.statement_end_offset = -1 
                THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
              ELSE qs.statement_end_offset END - 
    qs.statement_start_offset)/2)
    ,[Parent Query] = qt.text
    ,DatabaseName = DB_NAME(qt.dbid)
    FROM sys.dm_exec_query_stats qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
    ORDER BY [Average CPU used] DESC;
    

    これらはヘビーヒッタークエリについて説明しますが、残念ながら、CPUの小さなビットを個別に使用しているが、全体として大きなビットを使用している非常に大量の小さなクエリがあるデータベースを特定することはできません。これは、GlennAllanBerryのDMVクエリからのこのクエリで行うことができます :

    WITH DB_CPU_Stats
    AS
    (SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
      SUM(total_worker_time) AS [CPU_Time_Ms]
     FROM sys.dm_exec_query_stats AS qs
     CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                  WHERE attribute = N'dbid') AS F_DB
     GROUP BY DatabaseID)
    SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
           DatabaseName, [CPU_Time_Ms], 
           CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) 
           OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
    FROM DB_CPU_Stats
    WHERE DatabaseID > 4 -- system databases
    AND DatabaseID <> 32767 -- ResourceDB
    ORDER BY row_num OPTION (RECOMPILE);
    

    これらのクエリはどちらも、それらを実行したアプリケーションを識別せず、使用されるDMVはその情報を保存しません(アクションでクエリをキャッチし、sys.dm_exec_sessionsにアプリケーション名を記録するか、トレースを確認する必要があります)。

    もちろん、市場に出回っているさまざまなサードパーティのパフォーマンスツールを使用して、この作業を自動化できます(免責事項:私はそのうちの1つであるSQL Sentryで働いており、パフォーマンスアドバイザー 、これは、高コストのクエリを追跡し、それらが実行されたデータベースとそれらを呼び出したアプリケーションに関する情報を維持することを含め、上記のすべてを実行します。



    1. MySQLJOINクエリでnullの結果を無視する

    2. foreachステートメントの値を確認してください

    3. Oracleでセッションの通貨記号を変更する方法

    4. MySQLで流暢なnHibernateを設定する方法