Czy zachowanie ogrodzenia optymalizacyjnego CTE (Z zapytaniem) jest określone w standardzie SQL: 2008? Jeśli tak to gdzie?

23

Widzę częste odniesienia do WITHzapytań (wspólne wyrażenia tabelowe lub CTE), które działają jak płot optymalizacyjny, w którym serwer nie może wypychać filtrów w dół do zapytań CTE, wyciągać typowe wyrażenia z CTE itp. być zachowaniem wymaganym przez standardy SQL.

CTE są zdecydowanie ogrodzeniem optymalizacyjnym w PostgreSQL ... ale czy jest to wymagane przez standard, czy właściwie tylko szczegóły implementacji?

Na przykład te posty na liście adresowej twierdzą lub sugerują, że jest to standard:

Po wspomnieniu o tym w komentarzu zapytano mnie, gdzie jest ono określone - i po spojrzeniu na jedyną wersję SQL: 2008 mam dostęp do, że nie mam szczęścia znaleźć.

Nie intensywnie jeszcze przestudiowałem standardu, więc mam nadzieję na sugestię kogoś, kto ma: Czy ogrodzenie optymalizacyjne CTE w PostgreSQL jest rzeczywiście wymagane przez standard? A jeśli tak, to gdzie to jest określone? A może oświadczenia na liście mailingowej PG są błędne?

Zobacz także wątek Optymalizacja CTE na liście zadań? .

Craig Ringer
źródło

Odpowiedzi:

10

Myślę, że to szczegół implementacji.

Zgodna implementacja nie jest wymagana do wykonania dokładnej sekwencji działań określonych w Regułach ogólnych, pod warunkiem, że jej wpływ na dane SQL i schematy, parametry hosta i zmienną hosta oraz parametry SQL i zmienne SQL są identyczne z efektem tego sekwencja. Termin „ efektywnie” używany jest do podkreślenia działań, których efekt można osiągnąć w inny sposób poprzez wdrożenie. 1

Myślę, że implementator mógłby ocenić wspólne wyrażenie tabeli 20 razy, nawet na 20 różnych sposobów, i nadal mieć zgodną implementację. Jedynym istotnym zagadnieniem jest to, czy „jego efekt ... jest identyczny z efektem” sekwencji działań określonych w zasadach ogólnych.

[1] Sekcja 6.3.3.3, „Kolejność oceny reguł”, w projekcie standardu SQL 2008, o lokalnej nazwie pliku 5CD2-01-Framework-2006-01.pdf, s. 1. 41 mam żadnego pojęcia, gdzie mam go. Google może wiedzieć.

Mike Sherrill „Cat Recall”
źródło
2
Ma to sens - a ponieważ PostgreSQL pozwoli na użycie funkcji z efektami ubocznymi lub instrukcjami modyfikującymi dane w CTE, musi ogrodzić takie CTE. Myślę, że to oznacza, że ​​byłoby swobodnie wstawiać CTE, które tylko wywołują STABLElub IMMUTABLEdziałają.
Craig Ringer
Myślę, że zapisywalne wartości CTE nie są jeszcze w żadnych standardach SQL, ale nie jestem pozytywny.
Mike Sherrill „Cat Recall”
wCTE są z pewnością rozszerzeniem PostgreSQL. Jest mniej jasne, czy funkcje wykonujące DML są, ponieważ funkcje zdefiniowane przez użytkownika w SQL są tymi, SQL/PSMktórych Pg w ogóle nie obsługuje ...
Craig Ringer