11

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

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

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

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

4

2 回答 2

14

可以肯定的是,没有办法在 CTE 上创建索引,因为它基本上只是一个子查询,而不是一个表——它不会在任何地方保存在内存中,只是根据需要滚动到查询计划中。

但是您可以这样做Create Temp Table information As,然后将其编入索引,而对查询的更改很少。

您还可以索引物化视图,但如果您在下面有临时数据,那么创建另一个临时表可能最有意义。

于 2015-05-28T19:34:04.660 回答
5

不,您不能在查询期间对查询的某些部分创建索引。

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

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

于 2015-05-29T14:18:55.690 回答