Il comportamento del recinto di ottimizzazione di un CTE (query WITH) è specificato nello standard SQL: 2008? Se sì, dove?


23

Vedo riferimenti frequenti a WITHquery (espressioni di tabella comuni o CTE) che agiscono come un recinto di ottimizzazione, in cui il server non è autorizzato a spingere i filtri verso il basso nelle query CTE, estrarre espressioni comuni dal CTE, ecc. Viene spesso affermato essere un comportamento richiesto dagli standard SQL.

I CTE sono sicuramente una barriera di ottimizzazione in PostgreSQL ... ma è richiesto dallo standard, o in realtà solo dai dettagli di implementazione?

Ad esempio, questi post della mailing list rivendicano o suggeriscono che è standard:

Dopo averlo menzionato in un commento, mi è stato chiesto dove è specificato - e dopo aver visto l'unica bozza di SQL: 2008 ho accesso a non ho molta fortuna nel trovarlo.

Non ho ancora studiato intensamente lo standard, quindi spero in un suggerimento da qualcuno che abbia: La recinzione di ottimizzazione dei CTE in PostgreSQL è effettivamente richiesta dallo standard? E se è così, dove è specificato? O le dichiarazioni sulla mailing list Pg sono errate?

Vedi anche il recinto di ottimizzazione CTE del thread nell'elenco delle cose da fare? .

Risposte:


10

Penso che sia un dettaglio di implementazione.

Un'implementazione conforme non è richiesta per eseguire l'esatta sequenza di azioni definita nelle Regole generali, a condizione che il suo effetto su dati e schemi SQL, su parametri host e variabile host, e su parametri SQL e variabili SQL sia identico all'effetto di quello sequenza. Il termine è efficacemente usato per enfatizzare le azioni il cui effetto potrebbe essere ottenuto in altri modi da un'implementazione. 1

Penso che un implementatore possa valutare un'espressione di tabella comune 20 volte, anche in 20 modi diversi, e avere comunque un'implementazione conforme. L'unica questione rilevante è se "il suo effetto ... è identico all'effetto" della sequenza di azioni definita nelle Regole generali.

[1]. Sezione 6.3.3.3, "Ordine di valutazione delle regole", in una bozza dello standard SQL 2008, con il nome file locale 5CD2-01-Framework-2006-01.pdf, p. 41 Mi hanno alcuna idea di dove l'ho preso. Google potrebbe saperlo.


2
Questo senso makese - e poiché PostgreSQL consentirà l'uso di funzioni con effetti collaterali o dichiarazioni di modifica dei dati nei CTE, deve bloccare tali CTE. Immagino che ciò significhi che sarebbe libero di incorporare CTE che chiamano solo STABLEo IMMUTABLEfunzioni.
Craig Ringer,

Penso che i CTE scrivibili non siano ancora in alcuno standard SQL, ma non sono positivo.
Mike Sherrill "Cat Recall",

I wCTE sono certamente un'estensione PostgreSQL. È meno chiaro se le funzioni che eseguono DML lo sono, poiché le funzioni definite dall'utente in SQL sono SQL/PSMche Pg non supporta affatto ...
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.