De MSDN :
"Las operaciones de inserción se producen en columnas clave ascendentes o descendentes Las
estadísticas en columnas clave ascendentes o descendentes, como IDENTIDAD o columnas de marca de tiempo en tiempo real, pueden requerir actualizaciones estadísticas más frecuentes que las que realiza el optimizador de consultas. Las operaciones de inserción agregan nuevos valores a las columnas ascendentes o descendentes . El número de filas agregadas puede ser demasiado pequeño para activar una actualización de estadísticas. Si las estadísticas no están actualizadas y las consultas se seleccionan de las filas agregadas más recientemente, las estadísticas actuales no tendrán estimaciones de cardinalidad para estos nuevos valores. dar como resultado estimaciones de cardinalidad inexactas y un rendimiento de consulta lento.
Por ejemplo, una consulta que selecciona las fechas de pedidos de ventas más recientes tendrá estimaciones de cardinalidad inexactas si las estadísticas no se actualizan para incluir estimaciones de cardinalidad para las fechas de pedidos de ventas más recientes.
Después de las operaciones de mantenimiento
Considere actualizar las estadísticas después de realizar procedimientos de mantenimiento que cambien la distribución de datos, como truncar una tabla o realizar una inserción masiva de un gran porcentaje de las filas. Esto puede evitar retrasos futuros en el procesamiento de consultas mientras las consultas esperan actualizaciones de estadísticas automáticas ".
Puede usar "EXEC sp_updatestats" de vez en cuando en su sistema (programado en algún momento) o usar la función STATS_DATE en todos los objetos y ver cuándo se actualizaron sus estadísticas la última vez y si hubo demasiado tiempo desde entonces, use UPDATE ESTADÍSTICAS para ese objeto en particular. En mi experiencia, incluso con las estadísticas automáticas habilitadas, todavía estamos obligados a actualizar las estadísticas de vez en cuando, debido a las operaciones de inserción que no activaron la actualización automática.
Para agregar mi código personal (usado en un trabajo semanal que construye declaraciones dinámicas para la actualización de estadísticas):
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
)
Aquí obtengo todos los objetos en los que no se actualizaron las estadísticas durante más de 3 meses o desde la última actualización de estadísticas, se modificó más del 10% de las filas.
where col=(cast @var...)
) y@var
podrían serlo'%'
. Lo heredé hace una o dos semanas y necesito mantenerlo funcionando básicamente hasta que se reemplace. Gracias por el enlace, le daré un giro.