SQL解释计划:什么是Materialize?

时间:2010-06-12 19:25:39

标签: sql postgresql sql-execution-plan

我让PostgreSQL解释我的查询。部分原因是:

table_name --> Materialize

具体化是做什么的?我正在加入两张桌子,而不是观看或类似的东西。

5 个答案:

答案 0 :(得分:53)

实现节点意味着在执行上层节点之前,树中的任何内容(可以是扫描,或者一组完整的连接或类似的东西)的输出被内置到内存中。这通常在外部节点需要一个可以因某种原因重新扫描的源时完成。

因此,在您的情况下,规划人员确定您的某个表上的扫描结果将适合内存,并且直到可以选择需要重新扫描且仍然更便宜的上连接操作。

答案 1 :(得分:7)

这意味着它不能使用任何索引(或类似的方法)来使连接高效,因此最后一种方法是实现其中一个表的结果,以便在加入时使用较小的集合。其他表。

答案 2 :(得分:0)

我们可以说Materialize命令会创建一个View of a table(就像内存中的虚拟表或SnapShot表一样)

它用于通过在更具信息性的上下文中呈现数据来增强数据的可见性,并通过隐藏不需要查看/或不向谁的用户的关键或敏感数据来控制对数据的访问。什么展示它。

使用Materialise / Snap-Shot的主要好处是可以降低之后对该表的查询成本。 在执行计划中,相同的情况表明,如果我们使用materialise,那么我们可以获取多少好处与不使用时相比!

Explain to check execution plan

->  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)

我忽略了这个-->因为我不知道这样的算子,加上 - 之后会对表达式进行评论,我假设你的意思只是->

我希望这有帮助..

答案 3 :(得分:0)

在合并联接和嵌套循环联接中,数据库将“重新扫描”内部循环。 基本上像:

for each row in outer table:
    for each row in inner table:
        # do something

计划者将具体化内部循环表,这意味着将整个表加载到内存缓冲区中,以避免昂贵的磁盘IO成本。

有用的link

答案 4 :(得分:0)

从更经验的角度来看,您可以进行EXPLAIN ANALYZE并保留这些结果,然后更改标志:

set enable_material=off;

再次运行相同的EXPLAIN ANALYZE来逐行比较结果,您将确切地看到发生了什么变化,无论查询时间是好是坏,等等。修补一下长长的查询配置标志列表并观察效果。

https://www.postgresql.org/docs/current/runtime-config-query.html