Ist das Optimierungsverhalten einer CTE (WITH-Abfrage) im SQL: 2008-Standard festgelegt? Wenn ja, wo?

23

Ich sehe häufige Verweise auf WITHAbfragen (allgemeine Tabellenausdrücke oder CTEs), die als Optimierungsbereich fungieren und bei denen der Server keine Filter in die CTE-Abfragen hineinschieben, allgemeine Ausdrücke aus dem CTE herausziehen usw. Es wird oft behauptet ein von den SQL-Standards gefordertes Verhalten sein.

CTEs sind definitiv ein Optimierungsfaktor in PostgreSQL ... aber wird dies vom Standard verlangt oder sind es eigentlich nur Implementierungsdetails?

Diese Mailinglisten-Posts behaupten beispielsweise, dass es sich um Standard handelt, oder schlagen dies vor:

Nachdem ich es in einem Kommentar erwähnt hatte, wurde ich gefragt, wo es angegeben ist - und nach einem Blick auf den einzigen Entwurf von SQL: 2008 habe ich Zugriff darauf, dass ich nicht viel Glück habe, es zu finden.

Ich habe mich noch nicht intensiv mit dem Standard befasst und hoffe daher auf einen Vorschlag von jemandem, der Folgendes getan hat: Ist die Optimierung der CTEs in PostgreSQL tatsächlich vom Standard vorgeschrieben? Und wenn ja, wo ist es angegeben? Oder sind die Aussagen auf der Pg-Mailingliste fehlerhaft?

Siehe auch den Thread CTE Optimization Fence auf der ToDo-Liste? .

Craig Ringer
quelle

Antworten:

10

Ich denke, es ist ein Implementierungsdetail.

Eine konforme Implementierung ist nicht erforderlich, um die genaue Abfolge von Aktionen auszuführen, die in den Allgemeinen Regeln definiert sind, vorausgesetzt, ihre Auswirkung auf SQL-Daten und Schemata, auf Hostparameter und Hostvariablen sowie auf SQL-Parameter und SQL-Variablen ist mit der Auswirkung identisch Sequenz. Der Begriff effektiv wird verwendet, um Aktionen hervorzuheben, deren Wirkung auf andere Weise durch eine Implementierung erzielt werden könnte. 1

Ich denke, ein Implementierer könnte einen gemeinsamen Tabellenausdruck 20 Mal bewerten, auch auf 20 verschiedene Arten, und trotzdem eine konforme Implementierung haben. Die einzige relevante Frage ist, ob "seine Wirkung ... mit der Wirkung" der in den Allgemeinen Regeln festgelegten Abfolge von Handlungen identisch ist.

[1] Abschnitt 6.3.3.3, "Reihenfolge der Regelevaluierung", in einem Entwurf des SQL 2008-Standards mit dem lokalen Dateinamen 5CD2-01-Framework-2006-01.pdf, S. 23. 41 Ich habe keine Ahnung, woher ich es habe. Google könnte es wissen.

Mike Sherrill 'Cat Recall'
quelle
2
Das ist sinnvoll - und da PostgreSQL die Verwendung von Funktionen mit Nebenwirkungen oder datenmodifizierenden Anweisungen in CTEs zulässt, muss es solche CTEs einschränken. Ich denke, das bedeutet, dass es kostenlos wäre, CTEs einzubinden, die nur aufrufen STABLEoder IMMUTABLEfunktionieren.
Craig Ringer
Ich denke, beschreibbare CTEs sind noch nicht in einem SQL-Standard, aber ich bin nicht positiv.
Mike Sherrill "Cat Recall"
wCTEs sind sicherlich eine PostgreSQL-Erweiterung. Es ist weniger klar, ob es sich bei Funktionen, die DML ausführen, um benutzerdefinierte Funktionen in SQL handelt, SQL/PSMdie Pg überhaupt nicht unterstützt ...
Craig Ringer