11

私は、リレーショナル テーブルと jsonb テーブル (インデックスを作成できる) を組み合わせて使用​​する postgres データベースに取り組んでいます。

次のような一時テーブルから選択するデータを挿入または更新するために、多くの 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

5

いいえ、クエリ中にクエリの一部にインデックスを作成することはできません。

CTE (共通テーブル式) は、サブクエリ ファクタリングとも呼ばれます。この概念により、オプティマイザーは複雑なクエリの実行計画を生成できると同時に、同じ手順を再実行する代わりに、サブクエリを一時空間に置くことでサブクエリの繰り返しを減らすことができます。それを単一のクエリに入れると、手順としてではなく通常のクエリとしてすべて実行されるステップの 1 つの大きなリストが生成されます。ビューとして使用でき、実行計画をメモリに保存できます。
インデックス作成を許可しないという選択の一部は、インデックス作成の呼び出しが必要になり、メインクエリ用に再最適化する必要があるか、さらに悪いことに、実行計画はどのステップで推測するためのスペースを残す必要があるかということです実行します。インデックスを作成できる一時テーブルが既にあるため、このインデックス作成アクティビティを実行計画から除外することで、テーブルをクリーンに保つことができると思います。一時テーブルを作成してインデックスを作成すると、クエリを実行すると、新しく最適化された実行プランが作成されます。さらに、プロシージャの実行中は一時テーブルを保持できます。cte temp データは、クエリの完了後に削除されます。

ただし、CTE で一時テーブルを引き続き使用できるため、すべてかゼロかではありません。

于 2015-05-29T14:18:55.690 に答える