Cela devrait être une question assez simple. Puis-je ajouter un INDEX à une expression de table commune (CTE)?
Non.
Un CTE est une vue "en ligne" temporaire - vous ne pouvez pas ajouter d'index à une telle construction.
Si vous avez besoin d'un index, créez une vue régulière avec le SELECT de votre CTE et faites-en une vue indexée (en ajoutant un index clusterisé à la vue). Vous devrez obéir à un ensemble de règles décrites ici: Création d'une vue indexée .
J'ai eu la même exigence. Les index ne peuvent pas être ajoutés à un CTE. Cependant, dans le CTE sélectionnez l'ajout d'une clause ORDER BY sur les champs joints a réduit le temps d'exécution de 20 minutes ou plus à moins de 10 secondes.
(Vous devez également AJOUTER SELECT TOP 100 PERCENT pour autoriser un ORDER BY dans une sélection CTE.)
[modifier pour ajouter une citation paraphrasée à partir d'un commentaire ci-dessous]:
Si vous avez DISTINCT dans le CTE alors TOP 100 PERCENT ne fonctionne pas. Cette méthode de triche est toujours disponible: sans avoir besoin de TOP du tout dans la sélection, modifiez l'instruction ORDER BY pour lire:
COMMANDE PAR [Blah] OFFSET 0 ROWS