Frage

Um Transformationen in der Datenbank durchführen, ich häufig eine verkettete Reihe von Ansichten verwenden. Innerhalb der Ansichten werden allgemeine Tabellenausdrücke sein. Zum Beispiel hätte ich folgende:

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
    ), ....

Irgendwo in der Nähe TransformationStep4 werden die Ansichten langsamer geworden, da die Abfrage-Plan komplizierter wird. Dies wird und OK erwartet.

Aber wenn ich einen Teil TransformationStep4 uns anschließen möchte, wird die Abfrage verlangsamt enorm nach unten, wie der Optimierer versucht, seinen Weg der ganzen Weg zurück zu den Quellentabellen und sucht Indizes irgendeine Art zu finden. Normalerweise ist dies in Ordnung, aber manchmal mag ich nur mein temporäres Ergebnis speichern und kommen Sie mit, dass, weil (die Gestaltung Mensch in der Geschichte ist) ich man wissen, dass die Ergebnistabelle recht klein sein wird, und es wird viel schneller zu verbinden gegen einen "Prefetch" davon.

Gibt es eine Möglichkeit für mich, einen Abfrage-Hinweis zu schreiben, die den Abfrageplan so beeinflussen, dass die Unterabfrage vorab abgerufen wird, und dann trat gegen? Ansonsten werde ich auf temporäre Tabellen in einer gespeicherten Prozedur greifen, aber ich will, es zu vermeiden, wenn ich kann.

Vielen Dank für alle Vorschläge, auch wenn Sie denken, dass mein Design saugt: -)

War es hilfreich?

Lösung

Eine Ansicht ist ein Makro, das sich ausdehnt. Kein Caching oder Prefetching Vorkalkulation

Wenn Sie nicht indizierte Sichten, wo Sie NOEXPAND verwenden können .. aber diese werden nicht Wok auf gewöhnlichen Ansichten.

Sie können jedoch innere TOP verwenden / ORDER BY auch die Ansicht zu materialisieren:

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

Es gibt nichts Magisches an einem Blick: es ist nur Text und hat keine Erinnerung oder Persistenz ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top