ポスグレのSQLが爆速になったmaterialized


広告は適当。

先日他の人が作ったSQLで実行が爆速になった(数時間レベルのものが数分)ので、どういうことをやったのかなーと思って見てみました。

そうしたら、with句にmaterializedしてるだけだった。
あまりポスグレに詳しくないので、どういう構造なんだろう、と思って調べてみた結果の記事になります。

Common Table Expression (CTE)を使う方式で、コレを使うと「一度実行して結果を一時的にメモリ/ディスクに保存」とのこと。というかwith句の時点で持ってるわけじゃなかったのか(参照のたびに同じことやってるらしい。SQLが読みやすくなるだけなんだろうか)。この辺の挙動がoracleとポスグレで違うらしい。

データベース デフォルト動作 制御方法
Oracle 11g以前 常にマテリアライズ ヒントのみ
Oracle 11g R2+ マテリアライズ INLINE/MATERIALIZEヒント
Oracle 12c+ オプティマイザ判断 ヒントで明示可能
PostgreSQL インライン化 MATERIALIZED/NOT MATERIALIZED

てっきりoracleの挙動のようにwith句で一旦メモリに持っていると思っていたけど、ポスグレだとそうじゃない、って覚えておくとよいのかも。


参考:
https://taityo-diary.hatenablog.jp/entry/2025/02/09/110157