首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL Server CPU 100%解决方法

2013-08-23 
SQL Server CPU 100%我们数据库服务器现在CPU100%版本是SQL Server 2008 R2 SP1 企业版 64位通过profiler

SQL Server CPU 100%
我们数据库服务器现在CPU  100%
版本是SQL Server 2008 R2 SP1 企业版 64位
通过profiler抓到SQL,耗CPU最高的是类似 select (sum(page_count)/128.0) from sys.dm_db_index_physical_stats(5, 269244014, NULL, NULL, 'DETAILED')  这种SQL,
请问为什么这查询索引碎片的SQL会自动执行?什么情况下会自动执行这种SQL?
有谁能帮忙解答一下,谢谢!
[解决办法]
看看job里面有没有启动
[解决办法]
或者在JOB里,或者在三方工具里。。看看是哪个SPID,顺腾摸瓜呗
综合分析更全面
[解决办法]
看下这个系统视图的功能:返回指定表或视图的数据和索引的大小和碎片信息
是否有JOB或维护在做碎片整理?
当然,楼主看可以监控中看一下,是哪台机器,哪个用户来执行的这个操作,SPID大于50的是用户进程,小于50是系统进程。综合判断一下这条语句的来源
[解决办法]
能找到spid是什么不?然后用DBCC INPUTBUFFER(SPID)看看
[解决办法]
其实看那个语句,如果是系统引起的话,我个人猜测比较大的可能是维护计划里面的“更新统计信息”或者“重建索引”或者“重组索引”这几个操作引起的。
select (sum(page_count)/128.0) from sys.dm_db_index_physical_stats(5, 269244014, NULL, NULL, 'DETAILED') 至于是不是人为导致的,还得做其他监控。
[解决办法]

--先看一下是哪个表有这样的操作?这个表数据量很大?有很多索引?有人更改了表结构?数据变化很大?
--如果是系统自动统计,可以先结束掉这个进程。等系统空闲的时候,再重建索引

sys.dm_db_index_physical_stats ( 
    {database_id 
[解决办法]
 NULL }
    , { object_id 
[解决办法]
 NULL }
    , { index_id 
[解决办法]
 NULL 
[解决办法]
 0 }
    , { partition_number 
[解决办法]
 NULL }
    , { mode 
[解决办法]


 NULL 
[解决办法]
 DEFAULT }
)

SELECT DB_NAME(10)--数据库名
--然后切换到上面查询出来的数据库下
SELECT name FROM sys.objects--表名
WHERE OBJECT_ID = 5575058
--DETAILED:模式将扫描所有页并返回所有统计信息,速度最慢


[解决办法]
查询spid的登录时间,主机名,程序名,

select login_time,
       host_name,
       program_name
 from sys.dm_exec_sessions
 where session_id=[spid]

热点排行