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?
Non, ce qui se passe, c'est que le plan d'exécution d'une procédure stockée est mis en cache. En supposant qu'il y ait suffisamment de mémoire disponible pour continuer à conserver le plan, il ne changera pas à moins que l'un des événements suivants se produise (à partir de la mise en cache et de la réutilisation du plan d'exécution dans la documentation SQL Server, soulignement ajouté):
- Modifications apportées à une table ou à une vue référencée par la requête (ALTER TABLE et ALTER VIEW).
- Modifications apportées à une seule procédure, ce qui supprimerait tous les plans de cette procédure du cache (ALTER PROCEDURE).
- Modifications de tous les index utilisés par le plan d'exécution.
- Mises à jour des statistiques utilisées par le plan d'exécution, générées soit explicitement à partir d'une instruction, comme UPDATE STATISTICS, soit générées automatiquement.
- Suppression d'un index utilisé par le plan d'exécution.
- Un appel explicite à sp_recompile.
- Grand nombre de modifications apportées aux clés (générées par les instructions INSERT ou DELETE d'autres utilisateurs qui modifient une table référencée par la requête).
- Pour les tables avec déclencheurs, si le nombre de lignes dans les tables insérées ou supprimées augmente considérablement.
- Exécution d'une procédure stockée à l'aide de l'option WITH RECOMPILE.
Donc, si les statistiques sont mises à jour, le plan mis en cache prendra automatiquement en compte les nouvelles statistiques et sera recompilé.
Comment empêchez-vous les plans d'exécution de devenir obsolètes lorsque vous avez cent mille lignes ajoutées par jour?
Une façon est s'il y a beaucoup de mises à jour du tableau, comme mentionné ci-dessus. Quelques centaines de milliers de lignes modifiées peuvent satisfaire à cette condition. Mais si vous voulez être sûr ou avoir un contrôle plus précis: en mettant à jour vos statistiques. Vous pouvez autoriser SQL Server à créer et à gérer automatiquement des statistiques, ou à le faire manuellement vous-même. Vous pouvez trouver plus d'informations sur les deux méthodes dans les options de mise à jour automatique de SQL Server et de création automatique de statistiques . Lorsque / si vous effectuez une reconstruction hebdomadaire des index, cela déclenchera également la mise à jour des plans. Faites des tests pour voir ce qui vous est le plus avantageux, car la mise à jour trop fréquente des statistiques peut ne pas produire de résultats de performances réels.
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?
Vous n'avez pas besoin d'utiliser RECOMPILE
, car sur la base de l'extrait ci-dessus, vous pouvez voir que le plan d'exécution est mis à jour de manière appropriée chaque fois que de nouvelles statistiques sont disponibles. Vous pouvez être d'accord avec une mise à jour des statistiques de fin de journée (si vous êtes vraiment inquiet), mais je ne pense pas que ce soit explicitement un besoin basé sur ce que vous avez dit jusqu'à présent. Encore une fois, cependant, je le testerais pour voir quel impact cela pourrait avoir sur les performances de votre procédure stockée et planifier en conséquence.
RECOMPILE
ne provoquerait pas de toute façon une mise à jour des statistiques.