Espressioni di tabella comuni PostgreSQL vs una tabella temporanea?


11

La documentazione PostgreSQL su WITH mostra il seguente esempio:

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

Nota inoltre:

Una proprietà utile delle query WITH è che vengono valutate una sola volta per esecuzione della query principale, anche se vengono richiamate più di una volta dalla query principale o dalle query WITH di pari livello.

Vedo che WITHpuò essere utilizzato per altre cose, come la valutazione ricorsiva. Ma nell'esempio sopra, c'è qualche differenza importante tra l'utilizzo WITHe la creazione di tabelle temporanee?


quando si utilizza CTE per creare la query, l'aggiunta di un'altra colonna SELECTin WITHè semplicemente digitando il nome e rieseguendo. Mentre con tabella temporanea ci vorrebbe DROPe CREATE. D'altra parte, se si crea una query e si intende riutilizzare i dati statici molte volte, la creazione di una tabella temporanea con indici è sicuramente vantaggiosa per CTE.
Vao Tsun,

@VaoTsun se si utilizza TEMPORARY TABLEcon ON COMMIT DROPall'interno di una query, è anche solo questione di modificare la query e rieseguirla, giusto? postgresql.org/docs/9.6/static/sql-createtable.html
Nathan Long

Risposte:


16

Ci sono alcune sottili differenze, ma niente di drastico:

  • È possibile aggiungere indici in una tabella temporanea;
  • Esistono tabelle temporanee per tutta la durata della sessione (o, se ON COMMIT DROP, transazione), dove l' WITHambito è sempre strettamente limitato alla query;
  • Se una query richiama una funzione / procedura, si può vedere la tabella temporanea, ma può non vedere alcun WITHtavolo espressioni;
  • Una tabella temporanea genera VACUUMlavoro sui cataloghi di sistema che WITHno, ha bisogno di un ulteriore round trip per crearlo / riempirlo e richiede un lavoro extra nella gestione della cache del server, quindi è leggermente meno efficiente.

Nel complesso, dovresti preferire le WITHtabelle temporanee a meno che tu non sappia che trarrai vantaggio dalla creazione di un indice.

Tuttavia, l'altra opzione, una sottoquery nella FROMclausola, presenta una serie di vantaggi molto diversi. Può essere integrato, in particolare, e le qualificazioni possono essere tirate su / spinte verso il basso. Ne ho scritto in un recente articolo di blog .


Che dire delle viste e delle viste temporanee?
CMCDragonkai,

1
In mezzo ma più vicino a una tabella temporanea di un termine CTE. Nessun indice Sessione con ambito. Visibile a funzioni / procedure. Richiede catalogo vuoto.
Craig Ringer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.