Question

Pour effectuer des transformations dans ma base de données, j'utilise fréquemment un ensemble enchaîné de vues. Dans les vues sont communes expressions de table. Par exemple, je voudrais avoir:

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. Ceci est prévu et OK.

Mais quand je veux me joindre à une partie de TransformationStep4 à lui-même, la requête va ralentir énormément que l'optimiseur tente de retrouver son chemin jusqu'aux tables source et chercher des indices d'une certaine sorte. Normalement, c'est OK, mais parfois je veux juste stocker mon résultat temporaire et se joindre à cela parce que (étant l'humain de conception dans l'histoire) I pour un savoir que la table de résultat sera assez faible, et ce sera beaucoup plus rapide à se joindre contre un "prefetch" de celui-ci.

Est-il possible pour moi d'écrire un soupçon de requête, qui influencera le plan de requête de telle sorte que la sous-requête sera prélecture puis rejoint contre? Sinon, je vais devoir recourir à des tables temporaires dans une procédure stockée, mais je veux éviter si je peux.

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

Était-ce utile?

La solution

Une vue est une macro qui se dilate:. Il n'y a pas de mise en mémoire cache ou de pré-calcul prélecture

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

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top