我要求 PostgreSQL 解释我的查询。其中一部分解释是:
table_name --> Materialize
materialize函数是什么?我正在连接两个表,不是视图或类似的东西。
我要求 PostgreSQL 解释我的查询。其中一部分解释是:
table_name --> Materialize
materialize函数是什么?我正在连接两个表,不是视图或类似的东西。
Materialize节点指的是它下面树中任何内容(可能是扫描、完整的联接或类似操作)的输出在上方节点执行之前会被存储到内存中。通常情况下,当外部节点需要一个可重新扫描的来源时,才会这样做。
因此,在您的情况下,规划器确定了扫描您其中一个表格的结果将适合于内存,并且这将使选择需要重新扫描的上层联接操作变得更加便宜。
这意味着它不能使用任何索引(或类似的方法)来使连接更高效,因此作为最后的手段,它会将其中一个表的结果物化,以便在与另一个表连接时有一个较小的数据集可供使用。
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
命令将创建一个表的视图
(就像内存中的虚拟表或快照)。-> 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)
我忽略了这个-->
,因为在我的知识中没有这样的运算符,而且--会注释掉后面的表达式,我假设你只是指这个->
。
希望这可以帮到你。