Bonjour,
j'ai un problème désagréable avec une procédure stockée effectuant une requête select sur une vue indexée dont le temps d'exécution varie énormément. J'ai essayer de chercher sur internet et sur ce forum, sans trop du succès.

Mon problème est le suivant, j'ai une table contenant un assez grand nombre de données (quelques millions d'enregistrements) sous la forme Date et Heure, un "code périmètre" (une clé étrangère) et un certain nombre d'autre champs qui ne sont pas utiles ici. Le but de la requête est de savoir, pour une date donnée, le profil du nombre d'enregistrement pour chaque quart d'heure et pour chaque code de périmètre, puis de lier ces données à une autre table contenant des valeurs pour certaines combinaisons de dates, de code périmètre et de quart d'heure (jointure externe unilatérale).

Pour optimiser ce calcul (ainsi que d'autre basé sur le même type d'agrégation), j'ai créé une vue indexée qui agrège les lignes de la table contenant les données par date, quart d'heure et code périmètre, avec un indexe sur la date, le code, puis le numéro de quart d'heure. J'ai également créé une procédure stockée qui renvoie le résultat de la requête select effectuant la liaison. Seulement, l'optimiseur semble se contrebalancer de cet index, et le temps d'exécution de la requête varie selon le sens du vent et l'âge du capitaine entre quelques milisecondes et quelques minutes avec rigoureusement les mêmes données.

J'ai essayé de lancer une partie de la requête ainsi que de forcer l'utilisation de l'index de la vue indexée, mais rien n'y fait. Sur un simple select avec filtrage de la date (le premier élément de l'index cluster), certaines fois le résultat arrive quasi immédiatement, d'autres fois la requête prends quelques dizaines de secondes et SQL Server Management Studio me lance un sympathique avertissement m'indiquant que l'indicateur d'index sera ignoré.

Comme les procédures stockées sont utilisées dans une application winforms de façon assez directe (lorsqu'on clique sur un calendrier, le résultat de la requête pour le jour correspondant s'affiche dans l'interface), il est assez primordial que la requête soit rapide.

Quelqu'un aurait-il une idée sur ce qui pourrait entrainer des variations aussi importantes ? Pourquoi mon index est parfois ignoré, et parfois utilisé ? Et comment s'assurer qu'il le soit ?

La nuit porte conseil...

Résolu ce matin avec l'utilisation du hint "WITH (NOEXPAND)". C'est même encore plus rapide que lorsque l'analyseur choisissait par lui même d'utiliser l'index (c'est passé de quasi immédiat à immédiat).

Par contre, je ne comprends toujours pas pourquoi l'analyseur n'utilise pas l'index de la vue indexée par défaut.