Depuis MSDN :
"Les opérations d'insertion se produisent sur des colonnes clés ascendantes ou descendantes. Les
statistiques sur les colonnes clés ascendantes ou descendantes, telles que IDENTITY ou les colonnes d'horodatage en temps réel, peuvent nécessiter des mises à jour des statistiques plus fréquentes que celles effectuées par l'optimiseur de requêtes. Les opérations d'insertion ajoutent de nouvelles valeurs aux colonnes ascendantes ou descendantes. . Le nombre de lignes ajoutées peut être trop petit pour déclencher une mise à jour des statistiques. Si les statistiques ne sont pas à jour et que les requêtes sont sélectionnées à partir des dernières lignes ajoutées, les statistiques actuelles n'auront pas d'estimation de cardinalité pour ces nouvelles valeurs. Cela peut entraînent des estimations de cardinalité inexactes et des performances de requête lentes.
Par exemple, une requête qui sélectionne parmi les dates de commande client les plus récentes aura des estimations de cardinalité inexactes si les statistiques ne sont pas mises à jour pour inclure des estimations de cardinalité pour les dates de commande client les plus récentes.
Après les opérations de maintenance
Envisagez de mettre à jour les statistiques après avoir effectué des procédures de maintenance qui modifient la distribution des données, telles que tronquer une table ou effectuer une insertion en bloc d'un grand pourcentage des lignes. Cela peut éviter de futurs retards dans le traitement des requêtes pendant que les requêtes attendent les mises à jour automatiques des statistiques. "
Vous pouvez utiliser "EXEC sp_updatestats" de temps en temps sur votre système (prévu un certain temps) ou utiliser la fonction STATS_DATE sur tous les objets et voir quand leurs statistiques ont été réellement mises à jour la dernière fois et s'il y a trop de temps depuis lors, utilisez UPDATE STATISTIQUES pour cet objet particulier. D'après mon expérience, même avec les statistiques automatiques activées, nous sommes toujours obligés de mettre à jour les statistiques de temps en temps, en raison des opérations d'insertion qui n'ont pas déclenché la mise à jour automatique.
Pour ajouter mon code personnel (utilisé dans un travail hebdomadaire qui crée des instructions dynamiques pour la mise à jour des statistiques):
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
)
Ici, je reçois tous les objets pour lesquels les statistiques n'ont pas été mises à jour depuis plus de 3 mois ou depuis la dernière mise à jour des statistiques, plus de 10% des lignes ont été modifiées.
where col=(cast @var...)
) et@var
pourraient l'être'%'
. Je l'ai hérité il y a une semaine ou deux, et je dois le faire fonctionner jusqu'à ce qu'il soit remplacé. Merci pour le lien, je vais lui faire un tourbillon.