从MSDN:
“ 递增或递减键列
上发生插入操作递增或递减键列(例如IDENTITY或实时时间戳列)上的统计信息可能比查询优化器执行的统计信息更新更频繁。插入操作将新值附加到递增或递减列上。添加的行数可能太少而无法触发统计信息更新。如果统计信息不是最新的,并且查询是从最近添加的行中选择的,则当前统计信息将没有这些新值的基数估计。导致基数估计不准确并降低查询性能。
例如,如果未将统计信息更新为包括最近销售订单日期的基数估计,则从最近销售订单日期中选择的查询的基数估计将不准确。
维护操作之后可以
考虑在执行更改数据分布的维护过程后(例如,将表截断或对大部分行进行批量插入)更新统计信息。这样可以避免在查询等待自动统计信息更新时查询处理的将来延迟。”
您可能会不时在系统上使用“ EXEC sp_updatestats”(计划时间),或在所有对象上使用STATS_DATE函数,并查看上次实际更新其统计信息的时间,以及自那时以来是否有太多时间,请使用UPDATE。该特定对象的统计信息。以我的经验,即使启用了自动统计信息,我们仍然不得不不时地更新统计信息,因为插入操作不会触发自动更新。
要添加我的个人代码(用于每周工作,该工作为统计信息更新创建动态语句):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
在这里,我得到了三个月以来没有更新任何统计信息的所有对象,或者自上次统计信息更新以来,它更改了超过10%的行。
where col=(cast @var...)
),@var
可能是'%'
。我只是在一两个星期前继承了它,所以需要使其基本运转直到被替换。谢谢你的链接,我会旋转的。