31

データベースごとの CPU 使用率の内訳を取得することは可能ですか?

理想的には、SQL サーバー用のタスク マネージャー タイプのインターフェイスを探していますが、各 PID ( などtaskmgr) または各 SPID ( などspwho2k5) の CPU 使用率を調べる代わりに、各データベースの合計 CPU 使用率を表示したいと考えています。単一の SQL インスタンスを想定します。

sqlservr.exeこのデータを収集してレポートするツールを作成できることはわかっていますが、 CPU 負荷に最も貢献しているデータベースをリアルタイムで表示できるツールがあるかどうか疑問に思っています。

4

8 に答える 8

15

SQL Server (2000 以降) は、パフォーマンス カウンター (パフォーマンス モニターまたはパフォーマンス モニターから表示可能) をインストールします。

カウンター カテゴリの 1 つ (SQL Server 2005 のインストールから:) - SQLServer:Databases

データベースごとに 1 つのインスタンスを使用します。ただし、利用可能なカウンターは、CPU の適切な見積もりを取得するために使用できるレート カウンターがいくつかありますが、CPU % 使用率カウンターなどを提供しません。たとえば、2 つのデータベースがあり、測定されたレートがデータベース A で 20 トランザクション/秒、データベース B で 80 トランザクション/秒である場合、A が合計 CPU の約 20% に寄与していることがわかります。 B は他の 80% に貢献します。

行われているすべての作業が CPU バウンドであると仮定しているため、ここにはいくつかの欠陥がありますが、もちろんデータベースではそうではありません。しかし、それは私が信じている始まりになるでしょう。

于 2008-08-26T19:55:22.553 に答える
6

これは、高負荷の原因となっている実際のデータベースを表示するクエリです。これは、メモリ不足のシナリオで頻繁にフラッシュされる可能性のあるクエリキャッシュに依存しています(クエリの有用性が低下します)。

select dbs.name, cacheobjtype, total_cpu_time, total_execution_count from
    (select top 10
        sum(qs.total_worker_time) as total_cpu_time,  
        sum(qs.execution_count) as total_execution_count, 
        count(*) as  number_of_statements,  
        qs.plan_handle
    from  
        sys.dm_exec_query_stats qs 
    group by qs.plan_handle
    order by sum(qs.total_worker_time) desc
    ) a
inner join 
(SELECT plan_handle, pvt.dbid, cacheobjtype
FROM (
    SELECT plan_handle, epa.attribute, epa.value, cacheobjtype
    FROM sys.dm_exec_cached_plans 
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
     /* WHERE cacheobjtype = 'Compiled Plan' AND objtype = 'adhoc' */) AS ecpa 
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("dbid", "sql_handle")) AS pvt
) b on a.plan_handle = b.plan_handle
inner join sys.databases dbs on dbid = dbs.database_id
于 2012-04-10T18:56:20.077 に答える
1

上記のすべてを念頭に置いて。
SQL Server 2012 (2008 の可能性がありますか?) 以降、sys.dm_exec_sessionsに列database_idがあります。現在接続されているセッション の各データベースの cpu を簡単に計算できます。セッションが切断された場合、その結果はなくなりました。

select session_id, cpu_time, program_name, login_name, database_id 
  from sys.dm_exec_sessions 
 where session_id > 50;

select sum(cpu_time)/1000 as cpu_seconds, database_id 
 from sys.dm_exec_sessions 
group by database_id
order by cpu_seconds desc;
于 2016-09-16T06:57:47.900 に答える
1

あなたの質問に対する答えはノーだと思います。

問題は、マシン上の 1 つのアクティビティが複数のデータベースに負荷をかける可能性があることです。構成 DB から読み取り、ログ DB にログを記録し、タイプに基づいてさまざまな DB にトランザクションを出し入れするプロセスがある場合、CPU 使用率を分割するにはどうすればよいですか?

CPU 使用率をトランザクション負荷で割ることもできますが、これも大まかな指標であり、誤解を招く可能性があります。たとえば、ある DB から別の DB へのトランザクション ログの配布をどのように分割しますか? 読み取りまたは書き込みで CPU 負荷がかかっていますか?

マシンのトランザクション レートとそれが引き起こす CPU 負荷を調べたほうがよいでしょう。また、ストアド プロシージャをプロファイリングして、異常に時間がかかっているストアド プロシージャがないかどうかを確認することもできます。ただし、これでは必要な答えが得られません。

于 2009-02-03T22:01:55.230 に答える
0

SQL プロファイラを見たことがありますか?

標準の「T-SQL」または「ストアド プロシージャ」テンプレートを使用し、フィールドを微調整してデータベース ID でグループ化します (数字を使用する必要があると思います。データベース名はわかりませんが、exec sp_databases を使用すると簡単に見つけることができますリストを取得します)

これをしばらく実行すると、合計 CPU 数 / ディスク IO / 待機などが得られます。これにより、各データベースで使用されている CPU の割合がわかります。

PerfMon カウンターを同時に監視し (データを SQL データベースに記録する)、SQL プロファイラーに対しても同じことを行う (データベースに記録する) と、2 つを相互に関連付けることができる場合があります。

それでも、どの DB を詳しく調べる価値があるかについて、十分な手がかりが得られるはずです。次に、そのデータベース ID だけを使用して同じことをもう一度行い、最も高価な SQL/ストアド プロシージャを探します。

于 2009-02-03T22:27:49.423 に答える
0

SQL Sentryを見てください。それはあなたが必要とするすべてを行います。

よろしく、リーベン

于 2009-02-03T22:07:03.317 に答える
0

このクエリを確認してください:

SELECT 
    DB_NAME(st.dbid) AS DatabaseName
    ,OBJECT_SCHEMA_NAME(st.objectid,dbid) AS SchemaName
    ,cp.objtype AS ObjectType
    ,OBJECT_NAME(st.objectid,dbid) AS Objects
    ,MAX(cp.usecounts)AS Total_Execution_count
    ,SUM(qs.total_worker_time) AS Total_CPU_Time
    ,SUM(qs.total_worker_time) / (max(cp.usecounts) * 1.0) AS Avg_CPU_Time 
FROM sys.dm_exec_cached_plans cp 
INNER JOIN sys.dm_exec_query_stats qs 
    ON cp.plan_handle = qs.plan_handle
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE DB_NAME(st.dbid) IS NOT NULL
GROUP BY DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid),cp.objtype,OBJECT_NAME(objectid,st.dbid) 
ORDER BY sum(qs.total_worker_time) desc
于 2015-08-03T09:35:50.760 に答える