1

Pour effectuer des transformations dans ma base de données, j'utilise fréquemment un ensemble de vues chaînées. Dans les vues seront des expressions de table communes. Par exemple, je voudrais avoir:SQL Server 2008: Jointure de vue avec une autre vue: précalcul sans recourir aux tables temporaires

CREATE VIEW TransformationStep1 AS 
    WITH Transformation1A AS (
     SELECT Field1, Field2, Field3, Bla(Field1) AS Calc FROM Table1 
    ), 
    Transformation1B AS (
     SELECT Field1, Field2, Field3, Calc FROM Transformation1A 
    ) 
    SELECT * FROM Transformation1B 

CREATE VIEW TransformationStep2 AS 
    WITH Transformation2A AS (
     SELECT Field1, Calc FROM TransformationStep1 
    ), .... 

Quelque part près TransformationStep4 les vues deviendra plus lent que le plan de requête devient plus compliquée. C'est prévu et OK.

Mais quand je veux joindre une partie de TransformationStep4 à lui-même, la requête va ralentir énormément alors que l'optimiseur essaye de retrouver son chemin vers les tables sources et de chercher des index. Normalement, c'est OK, mais parfois je veux juste stocker mon résultat temporaire et le rejoindre parce que (étant le concepteur humain dans l'histoire) je sais que la table des résultats sera assez petite, et il sera beaucoup plus rapide de rejoindre contre une "préextraction" de celui-ci.

Existe-t-il un moyen pour moi d'écrire un indice de requête, qui influencera le plan de requête de telle sorte que la sous-requête sera pré-recherchée et ensuite jointe? Sinon, je devrai recourir aux tables temporaires dans une procédure stockée, mais je veux l'éviter si je le peux.

Merci pour toutes suggestions, aussi quand vous pensez que ma conception suce :-)

Répondre

4

Une vue est une macro qui se développe: il n'y a pas de mise en cache ou pré-calcul prélecture.

Sauf si vous avez des vues indexées où vous pouvez utiliser NOEXPAND .. mais celles-ci ne fonctionneront pas sur les vues ordinaires.

Cependant, vous pouvez utiliser TOP/ORDER BY pour matérialiser intérieure la vue aussi:

SELECT 
    * 
FROM 
    (SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1 
    JOIN 
    (SELECT TOP...) bar on foo.x = bar.x 

Il n'y a rien de magique vue: il est juste texte et n'a pas de mémoire ou la persistance ...

+1

Le TOP fonctionne! Génial, maintenant je peux l'utiliser pour matérialiser mes expressions de table communes. (Je ne pensais pas qu'une vue était magique, je veux juste être en mesure de manipuler l'optimiseur de requête pour ne pas recurse dans mon CTE ..) – thomaspaulb

Questions connexes