IT用語集 › データベース › MATERIALIZED CTE

MATERIALIZED CTE

データベース Svenska → 更新: 2026-10-23

PostgreSQLのキーワード(WITH ... AS MATERIALIZED / NOT MATERIALIZED)。CTEを一度だけ計算してバッファに保持するか、メインクエリにインライン展開してプランナーに境界をまたいだ最適化をさせるかを決める。CTEが性能向上になるか、ボトルネックになるかの分かれ目である。

背景として、PostgreSQL 12より前は、すべてのCTEが「最適化フェンス」だった。常に別個に実体化(計算)されるため、プランナーがフィルタ条件を押し下げられず、同等のサブクエリよりはるかに遅くなることがあった。v12以降は、一度しか使われないCTEは既定でインライン展開される(NOT MATERIALIZED)。多くの場合はこちらのほうが速い。MATERIALIZED は従来の動作を強制するもので、CTEが高コストで複数回参照されるとき(一度だけ計算する)や、プランナーによる再計算をあえて止めたいときに役立つ。経験則は、既定のままにしておき、高コストな再利用にはMATERIALIZED、旧来のパターンで強制的にインライン化したいときはNOT MATERIALIZEDを意図的に使うことだ。分析系クエリのチューニングに使える具体的な道具である。

← 用語集に戻る