SQL解释计划:什么是Materialize?

Cla*_*diu 37 sql postgresql sql-execution-plan

我问PostgreSQL解释我的查询.部分解释是:

table_name --> Materialize
Run Code Online (Sandbox Code Playgroud)

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

Mag*_*der 53

具体化节点意味着在执行上层节点之前,树中的任何低于它的输出(可以是扫描,或者一组完整的连接或类似的东西)被内置到存储器中.这通常在外部节点需要可以由于某种原因而重新扫描的源时完成.

因此,在您的情况下,计划程序确定您的一个表上的扫描结果将适合内存,并且直到可以选择需要重新扫描的上部联接操作,同时仍然更便宜.

  • 解释它的一个简单方法是它存储中间结果. (14认同)
  • 您有任何文档链接吗?我找不到任何。 (2认同)

Guf*_*ffa 7

这意味着它不能使用任何索引(或类似方法)来使连接高效,因此最后一种方法是将其中一个表的结果具体化,以便在与另一个表连接时使用较小的集合.

  • 不,它不会作为最后一个选项.最后一个选项是仅执行顺序扫描而根本不实现.这样做是因为它可以通过这种方式推动更智能的计划,并且不必回到最后的手段. (2认同)

liu*_*ihe 7

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

for each row in outer table:
    for each row in inner table:
        # do something
Run Code Online (Sandbox Code Playgroud)

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

一个有用的链接