PostgreSQL 上的 CTE 和临时索引

CTE and temporary index on PostgreSQL

我在 postgres 数据库上工作,我将混合使用关系 tables 和 jsonb tables(可以索引)。

我一直在使用大量 CTE 查询来插入或更新从临时 table 中选择的数据,例如:

WITH information as (
    select fieldA, fieldB, fieldC from tableA
)
insert (fieldA, fieldB, fieldC)
SELECT inf.fieldA, inf.fieldB, inf.fieldC
from information inf

嗯,我想知道是否可以在这种 table 中创建临时索引,如果可以,是否也可以在 jsonb 类型字段中创建索引? (考虑到这个临时 tables)

很确定没有办法在 CTE 上创建索引,因为它基本上只是一个子查询,而不是 table - 它不会持久保存在内存中的任何地方,只是根据需要滚动到查询计划中.

但您可以改为 Create Temp Table information As,然后对其进行索引,而对您的查询几乎没有任何改变。

您也可以为实体化视图建立索引,但如果您有临时数据,创建另一个临时数据 table 可能最有意义。

不可以,在查询过程中,您不能在部分查询上创建索引。

CTE(常见的table表达式),也称为子查询分解。该概念允许优化器为复杂查询生成执行计划,同时允许它通过将其放入 temp space 而不是重新执行相同的步骤来减少子查询的重复。将它放在单个查询中会生成一个大的步骤列表,这些步骤全部作为常规查询而不是作为过程执行。它可以在那里用作视图并在内存中存储执行计划。
不允许索引的部分选择是它需要调用索引,然后必须针对主查询重新优化或更糟,执行计划将不得不离开 space 到猜测执行哪一步。 由于我们已经有了可以索引的临时 tables,我相信将此索引 activity 排除在执行计划之外会保持干净。构建一个临时 table,对其进行索引,然后当您 运行 查询时,它将具有全新优化的执行计划。加上临时 table 可以在您的过程期间持续存在,查询完成后 cte 临时数据将被删除。

但您仍然可以在 CTE 中使用临时 table,因此它不是全有或全无。