CTE(クエリ付き)の最適化フェンスの動作は、SQL:2008標準で指定されていますか?もしそうなら、どこで?


23

WITHクエリ(共通テーブル式、またはCTE)への頻繁な参照が最適化フェンスとして機能し、サーバーがフィルターをCTEクエリにプッシュダウンしたり、共通式をCTEから取り出したりすることを許可されていないことがよくあります。 SQL標準で要求される動作であるため。

CTEは間違いなくPostgreSQLの最適化フェンスです...しかし、これは標準で必要なのですか、実際には実装の詳細だけですか?

たとえば、これらのメーリングリストの投稿は、それが標準であると主張または示唆しています。

コメントでそれ言及し私はそれがどこに指定されているのか尋ねられました-そしてSQL:2008の唯一のドラフトを見た後、私はそれを見つける運があまりありません。

私はまだ標準を徹底的に研究していないので、次のような人からの提案を期待しています。もしそうなら、それはどこに指定されていますか?または、Pgメーリングリストのステートメントにエラーがありますか?

ToDoリストのスレッドCTE最適化フェンスも参照してください

回答:


10

実装の詳細だと思います。

SQLデータとスキーマ、ホストパラメーターとホスト変数、およびSQLパラメーターとSQL変数に対する効果がその効果と同じである場合、一般的なルールで定義されたアクションの正確なシーケンスを実行するために、準拠する実装は必要ありません。シーケンス。この用語は、効果的に実装によって他の方法で達成できるアクションを強調するために効果的に使用されます。1

実装者は、20の異なる方法でさえも、共通のテーブル式を20回評価でき、それでも準拠する実装ができると思います。唯一の関連する問題は、一般規則で定義された一連のアクションの「その効果が効果と同一であるかどうか」です。

[1]。ローカルファイル名が5CD2-01-Framework-2006-01.pdfであるSQL 2008標準のドラフトのセクション6.3.3.3、「ルール評価順序」。41は私が持っていない何も、私はそれを得たアイデアを。Googleは知っているかもしれません。


2
それは理にかなっています-PostgreSQLは、CTEで副作用やデータ変更ステートメントを伴う関数の使用を許可するため、そのようなCTEをフェンスする必要があります。それは、コールSTABLEまたはIMMUTABLE関数のみを呼び出すCTEを自由にインライン化できることを意味すると思います。
クレイグリンガー

私は、書き込み可能のCTEがあると思いません任意のSQL標準ではまだ、私は肯定的ではありませんよ。
マイクシェリル 'キャットリコール'

wCTEは確かにPostgreSQLの拡張機能です。SQLで、ユーザー定義関数があるので、DMLを実行する関数は、あるかどうかはあまり明らかだSQL/PSMPgがすべてではサポートしていない...
クレイグリンガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.