Domanda

Per eseguire le trasformazioni nel mio database, io spesso uso un insieme concatenato di punti di vista. Entro il punto di vista sarà espressioni di tabella comuni. Per esempio avrei il seguente:

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

Da qualche parte vicino TransformationStep4 i punti di vista diventerà più lento in quanto il piano di query diventa più complicato. Questo è previsto e OK.

Ma quando voglio partecipare a una parte di TransformationStep4 a se stesso, la query rallenterà enormemente come l'ottimizzatore cerca di trovare la via del ritorno fino alle tabelle di origine e aspetto per gli indici di qualche tipo. Normalmente questo è OK, ma a volte voglio solo salvare il mio risultato temporaneo e unirsi con quella perché (essendo l'umano progettazione nella storia) io per primo sappiamo che la tabella dei risultati sarà abbastanza piccola, e sarà molto più veloce per unire contro un "prefetch" di esso.

C'è un modo per me di scrivere un hint per la query, che influenzerà il piano di query in modo tale che la subquery sarà eseguito il prefetching e poi si è unito contro? Altrimenti dovrò ricorrere a tabelle temporanee in una stored procedure, ma voglio evitare, se possibile.

Grazie per qualsiasi suggerimento, anche quando pensi che il mio progetto fa schifo: -)

È stato utile?

Soluzione

Una vista è una macro che si espande. Non vi sono cache o di precarica pre-calcolo

Se non avete viste indicizzate in cui è possibile utilizzare NOEXPAND .. ma questi non sarà wok su una vista comune.

Tuttavia, è possibile utilizzare TOP interna / ORDER BY per materializzare la vista troppo:

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

Non c'è nulla di magico in una vista: è solo testo e non ha memoria o la persistenza ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top