順調に運用しているSQLServerのCPU利用率が突然高くなり、クエリの応答速度が悪くなる時があります。
とりあえずの対策として、インデックスデフラグや統計情報を更新すると改善する場合があります。CPU負荷を確認してsp_updatestatsを実行するクエリをジョブに設定し、定期的に実行しておくと安心かもしれません。
大きなテーブルを利用しているクエリで発生しているのであれば、トレースフラグ2371を設定するのも有効かもしれません。
参考:http://blogs.msdn.com/b/jpsql/archive/2013/06/17/sql-server-2012-2008-r2-colmodctr.aspx
CPU利用率の10分間の平均が70%以上で、全ユーザDBの統計情報を更新します。
-------------------------------------------------------------------------------------
--CPU使用率~統計情報更新
-------------------------------------------------------------------------------------
SET NOCOUNT ON
SET QUOTED_IDENTIFIER ON
DECLARE @ts_now BIGINT
DECLARE @cpu_usage INT
DECLARE @dbename VARCHAR (255)
SELECT @ts_now = cpu_ticks / CONVERT(FLOAT, (cpu_ticks / ms_ticks))
FROM sys.dm_os_sys_info
SELECT
@cpu_usage = avg(SQLProcessUtilization)
FROM
(SELECT
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization,
TIMESTAMP
FROM (
SELECT TIMESTAMP, CONVERT(XML, record) AS record
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
AND record LIKE '%<SystemHealth>%') AS x
) AS y
WHERE DATEADD(ms, -1 * (@ts_now - [TIMESTAMP]), GETDATE()) >=DATEADD(MINUTE,-10,GETDATE())
--70%未満であれば、終了
IF @cpu_usage < 70
BEGIN
--問題なければ
GOTO ENDLABEL
END
RAISERROR ('%s', 10, 1 ,'CPU使用率が高いため、統計情報を更新します' ) WITH LOG
--統計情報更新
-- Declare cursor for list
DECLARE dbname CURSOR FOR
SELECT [name] FROM sys.databases
WHERE is_read_only = 0 AND database_id > 4
-- Open the cursor
OPEN dbname
-- loop
FETCH NEXT
FROM dbname
INTO @dbename
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'DB = ' + @dbename
EXEC ('use [' + @dbename + '] EXEC sp_updatestats ;' );
-- loop
FETCH NEXT
FROM dbname
INTO @dbename
END
CLOSE dbname
DEALLOCATE dbname
--終了
ENDLABEL: