34,838
社区成员




2008 R2数据库 兼容级别 100
今天排查一个性能问题,最后发现是由于业务表中于统计信息过期导致
使用脚本
SELECT DISTINCT
OBJECT_NAME(SI.object_id) AS Table_Name ,
SI.name AS Statistics_Name ,
STATS_DATE(SI.object_id, SI.index_id) AS Last_Stat_Update_Date ,
SSI.rowmodctr AS RowModCTR ,
SP.rows AS Total_Rows_In_Table ,
'UPDATE STATISTICS [' + SCHEMA_NAME(SO.schema_id) + '].['
+ OBJECT_NAME(SI.object_id) + ']' + SPACE(2) + SI.name AS Update_Stats_Script
FROM sys.indexes AS SI( NOLOCK )
INNER JOIN sys.objects AS SO( NOLOCK ) ON SI.object_id = SO.object_id
INNER JOIN sys.sysindexes SSI( NOLOCK ) ON SI.object_id = SSI.id
AND SI.index_id = SSI.indid
INNER JOIN sys.partitions AS SP ON SI.object_id = SP.object_id
WHERE SSI.rowmodctr > 0
AND STATS_DATE(SI.object_id, SI.index_id) IS NOT NULL
AND SO.type = 'U'
And OBJECT_NAME(SI.object_id)='dlyndx'
ORDER BY RowModCTR DESC
查到有大量的统计信息已有很多变更计数,但是一直未更新统计信息
按照https://www.cnblogs.com/kerrycode/p/3688804.html 潇湘隐者 中的方式
对应相关查询后,统计信息还是未被更新这个为什么呢
自动更新状态为开启
每周重建一次索引吧。
如果大表不多,一天一次也可以的。
这个效果是最好的,统计信息更新了,而且索引效率高。
索引中的set属性STATISTICS_NORECOMPUTE,设置为off了,需要改为on
印象里好像必须满足一定条件才触发的。
你可以查询下具体的触发值。 好像是变更行达到总共的20% 左右。
或者创建job 定期更新 index , statistics 吧。