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:模式将扫描所有页并返回所有统计信息,速度最慢
select login_time,
host_name,
program_name
from sys.dm_exec_sessions
where session_id=[spid]