J'essaie de mieux comprendre (conceptuellement) la relation entre les statistiques, les plans d'exécution, l'exécution des procédures stockées.
Ai-je raison de dire que les statistiques ne sont utilisées que lors de la création du plan d'exécution d'une procédure stockée et qu'elles ne sont pas utilisées dans le contexte d'exécution réel? En d'autres termes, si cela est vrai, une fois le plan créé (et en supposant qu'il est correctement réutilisé), quelle est l'importance des statistiques "à jour"?
J'ai été particulièrement motivé par un article que j'ai lu ( Statistiques, estimations de lignes et colonne de date ascendante ) qui décrit un scénario très similaire à celui auquel je suis confronté quotidiennement avec plusieurs bases de données de nos clients.
Nous avons une colonne de date / heure ascendante dans l'une de nos plus grandes tables que nous interrogeons régulièrement à l'aide d'une procédure stockée spécifique.
Comment empêchez-vous les plans d'exécution de devenir obsolètes lorsque vous avez cent mille lignes ajoutées par jour?
Si nous mettons fréquemment à jour les statistiques pour lutter contre ce problème, serait-il judicieux d'utiliser l'indication OPTION (RECOMPILE) sur la requête de cette procédure stockée?
Tout conseil ou recommandation serait apprécié.
Mise à jour : j'utilise SQL Server 2012 (SP1).
la source
RECOMPILE
ne provoquerait pas de toute façon une mise à jour des statistiques.Non, les statistiques obsolètes peuvent entraîner une recompilation liée à l'optimalité de l'instruction affectée.
Les plans d'exécution sous-optimaux causés par des valeurs de prédicat en dehors (spécifiquement au-dessus) de la plage de valeurs stockées dans l'histogramme statistique correspondant est connu sous le nom de problème de clé ascendante . La reconstruction des statistiques est une solution possible, mais elle peut être très gourmande en ressources. Les alternatives incluent:
Indicateurs de trace 2389 et 2390 . Cela nécessite qu'un index existe avec la colonne problématique comme clé principale. Il ne fonctionne pas avec les tables partitionnées et n'est efficace dans SQL Server 2014 que si l'estimateur de cardinalité d'origine est utilisé. L'indicateur de trace 4139 peut également être requis si l'objet statistique est marqué comme stationnaire.
Mise à niveau vers SQL Server 2014. Le nouvel estimateur de cardinalité inclut une logique pour estimer au-delà de l'histogramme à l'aide des informations de densité moyenne. Cela peut être moins précis que les indicateurs de trace 2389/2390 dans certaines circonstances importantes.
Activez des mises à jour automatiques des statistiques plus fréquentes pour les grandes tables avec l' indicateur de trace 2371 . Avec cet indicateur de trace, au lieu de mettre à jour après 20% + 500 changements, seules les
SQRT(1000 * Table rows)
modifications sont requises. Ce n'est pas une solution aussi complète que celles mentionnées précédemment, car les mises à jour peuvent ne pas être déclenchées assez souvent.Si la source de votre problème n'est pas tant des compilations de plans fréquentes basées sur des valeurs de prédicat au-delà de l'histogramme, mais davantage sur les effets de la mise en cache occasionnelle d'un tel mauvais plan à la suite d'un reniflage de paramètres, vous pouvez également envisager:
OPTIMIZE FOR (@parameter = value)
pour compiler un plan pour une valeur représentative connueOPTIMIZE FOR (@parameter UNKNOWN)
pour optimiser en utilisant la distribution moyenneOPTIMIZE FOR UNKNOWN
(identique à 4136, mais par requête)OPTION (RECOMPILE)
pour compiler à chaque fois, renifler la valeur particulière. Si la grande majorité des valeurs d'exécution se trouvent dans l'histogramme, cela peut être efficace.Pour plus d'informations sur le reniflage de paramètres, l'incorporation et les options de recompilation, consultez mon article sur SQLperformance.com.
la source