Mat*_*des 8 postgresql temp-tables jsonb postgresql-9.4
我在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
Run Code Online (Sandbox Code Playgroud)
好吧,我想知道是否有可能在这种表中创建临时索引,如果是,是否可以在jsonb类型fieds中创建索引?(考虑这个临时表)
IMS*_*SoP 10
很确定没有办法在CTE上创建索引,因为它基本上只是一个子查询,而不是表 - 它不会在任何地方保存在内存中,只是根据需要进入查询计划.
但你可以做Create Temp Table information As,然后索引,你的查询几乎没有变化.
您也可以索引物化视图,但如果您有下面的临时数据,那么创建另一个临时表可能最有意义.
不,您不能在查询期间对查询的某些部分创建索引。
CTE(公用表表达式),也称为子查询分解。这个概念允许优化器为复杂查询生成执行计划,同时允许它通过将子查询放入临时空间而不是重新执行相同的步骤来减少子查询的重复。将其放入单个查询中会生成一个大的步骤列表,这些步骤全部作为常规查询而不是作为过程执行。它可以用作视图并在内存中存储执行计划。
选择不允许索引的部分原因是,它需要调用索引,然后必须针对主查询重新优化索引,或者更糟糕的是,执行计划必须留出空间来猜测哪一步执行。由于我们已经有了可以建立索引的临时表,因此我相信它可以保持表的干净,从而使索引活动远离执行计划。构建一个临时表,为其建立索引,然后当您运行查询时,它将具有新优化的执行计划。另外,临时表可以在整个过程期间持续存在,cte 临时数据在查询完成后将被删除。
但您仍然可以在 CTE 中使用临时表,因此它不是全有或全无。
| 归档时间: |
|
| 查看次数: |
6073 次 |
| 最近记录: |