PostgreSQLにクエリの説明を依頼しました。説明の一部は:
table_name --> Materialize
マテリアライズは何をしますか?ビューではなく、2つのテーブルを結合しています。
マテリアライズノードとは、ツリー内でその下にあるもの(スキャン、結合の完全なセットなど)の出力が、上位ノードが実行される前にメモリにマテリアライズされることを意味します。これは通常、何らかの理由で再スキャンできるソースが外部ノードに必要な場合に行われます。
したがって、あなたのケースでは、プランナはテーブルの1つでのスキャンの結果がメモリに収まると判断しているため、再スキャンを必要とする上位の結合操作を選択でき、しかもより安価です。
つまり、結合を効率的にするためにインデックス(または同様の方法)を使用できないため、最後の手段として、テーブルの1つからの結果を具体化し、他のテーブルに対して結合するときに使用するセットを小さくします。
マージ結合とネストされたループ結合では、データベースは内部ループを「再スキャン」します。基本的には:
for each row in outer table:
for each row in inner table:
# do something
プランナーは内部ループテーブルを具体化します。つまり、テーブル全体をメモリ内バッファーにロードして、高価なディスクを回避しますIOコスト。
便利な リンク 。
より経験的な観点から、EXPLAIN ANALYZE
およびそれらの結果を保持してから、フラグを変更します。
set enable_material=off;
行って同じEXPLAIN ANALYZE
をもう一度クリックして結果を行ごとに比較すると、クエリの時間が良いか悪いかなど、正確にどのような変化があるかがわかります。クエリ設定フラグの長いリストをいじくり回して、効果を観察します。
https://www.postgresql.org/docs/current/runtime-config-query.html
Materialize
コマンドはView of a table
(仮想テーブルのようにORメモリ内のテーブルのSnapShot
)
これは、より情報的なコンテキストでデータを提示することによりデータの可視性を強化し、重要なデータや機密データを、それを見る必要のないユーザー、または私たちが何をすべきかを知らないユーザーから隠すことにより、データへのアクセスを制御するために使用されますそれを示す。
Materialize/Snap-Shotを使用する主な利点は、後でそのテーブルに対するクエリのコストを削減できることです。実行計画では、同じように、マテリアライズを使用した場合と使用しない場合に比べて、どれだけの利益を得ることができるかについて述べています。
-> Materialize (cost=0.29..8.51 rows=10 width=244)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..8.46 rows=10 width=244)
Index Cond: (unique2 < 10)
私はこれを無視しました-->
私の知る限りそのような演算子はないので、さらに-は後で式をコメントします。これは->
のみ。
これがお役に立てば幸いです。