我在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类型中创建索引? (考虑这个临时表)
答案 0 :(得分:10)
非常肯定没有办法在CTE上创建索引,因为它基本上只是一个子查询,而不是一个表 - 它没有在任何地方保存在内存中,只是滚动根据需要进入查询计划。
但您可以改为Create Temp Table information As
,然后将其编入索引,只需对您的查询进行少量更改。
您也可以索引实体化视图,但如果下面有临时数据,那么创建另一个临时表可能最有意义。
答案 1 :(得分:3)
在查询期间,您无法在查询的某些部分创建索引。
CTE(公用表表达式),也称为子查询因子。该概念允许优化器为复杂查询生成执行计划,同时允许它通过将子查询放入临时空间而不是重新执行相同的步骤来减少子查询的重复。将它放在一个查询中会生成一个大的步骤列表,这些步骤都作为常规查询而不是作为过程执行。它可以用作视图并在内存中存储执行计划 不允许索引的部分选择是它需要调用索引,然后必须为主查询重新优化,或者更糟糕的是,执行计划必须留出空间来猜测哪一步执行。 由于我们已经有可以编制索引的临时表,我相信它会保持干净,以使这个索引活动不在执行计划之外。构建临时表,对其进行索引,然后在运行查询时,它将具有新近优化的执行计划。此外,临时表可以在您的过程持续时间内持续存在,cte临时数据将在查询完成后被删除。
但你仍然可以在CTE中使用临时表,所以它不是全部或全部。