判断MS SQLserver实例CPU过高解决方法:
1.登录数据库服务器:
2.查看CPU并行度设置,将其设置为1,可有效释放CPU资源给其他进程,右击实例-->ServerProperties-->Advanced-->Parallelism(调整Max Degreeof Parallelism=1),如下图所示:
3.执行sp_who_lock查看阻塞占用过多CPU资源语句,进行优化:
查看索引缺失:
SELECT
DatabaseName = DB_NAME(database_id)
,[Number Indexes Missing] = count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost *avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
4.同时执行执行下面代码观察open的process,对于一直不变的进程进行kill:
dbcc opentran --多次执行, 如果同一个spid多次出现 , 表示有问题
dbcc inputbuffer(spid) --再次查询spid进程的内容
5.查看活动监视器%Process Time(100%),看看不否有资源等待信息:
6.如果以上方法都不能解决时,运行下面的语句查询正在被等待的资源语句,找到对应的资源等待表,然后运行对应的语句找到该表中所有的锁等待进程,找到源头假死进程,进行kill spid杀掉,以释放资源
SELECT [Spid] = session_Id, ecid, [Database] = DB_NAME(sp.dbid),
[User] = nt_username, [Status] = er.status,
[Wait] = wait_type,
[Individual Query] = SUBSTRING(qt.text, er.statement_start_offset / 2, (CASE WHEN er.statement_end_offset = - 1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))
* 2 ELSE er.statement_end_offset END - er.statement_start_offset) / 2),
[Parent Query] = qt.text,
Program = program_name, Hostname,
nt_domain, start_time
FROM sys.dm_exec_requests er INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
WHERE session_Id > 50 /* Ignore system spids.*/ AND session_Id NOT IN (@@SPID)
7.下面语句查出来包含所有的等待锁,包含已经没有执行但是没有释放的锁。
select * fromsys.dm_tran_locks where resource_type='OBJECT' and OBJECT_NAME(resource_associated_entity_id)='ACTIVITY'