パーティションテーブルにグローバルパーティションインデックスがある場合は、DELETEおよびUPDATEのDML操作でグローバルパーティションインデックススキャンを使用できます。
Usage
- パーティションテーブルとグローバルパーティションインデックスの作成:
( a int, b int, c intは常に (b * 2) として生成され、 d intデフォルト0、 e int, fテキスト、 gテキスト ) 範囲によるパーティー (a) ( パーティションp0の値が (50) 未満、 パーティションp1の値が (100) 未満、 パーティションp2の値が (200) 未満、 パーティションp3の値が (300) 未満、 パーティションp4の値が (400) 未満、 パーティションp5の値が (500) 未満、 パーティションp6の値が (600) 未満、 パーティションp7の値が (700) 未満、 パーティションp8の値が (800) 未満 ); INSERT INTO gi_ora(a、b、d、e、f、g) SELECT i、i、(random()* 1000)::int、(random()* 30000000)::int::text、(random()* 30000000)::int::text FROM generate_series(1,799) i; CREATE INDEX ON gi_ora(b) グローバルPARTITION BY RANGE (b) ( パーティションgpi_p0の値が (500) 未満、 パーティションgpi_p1の値が (maxvalue) 未満 ); 分析gi_ora;
- 指定されたデータに対するDELETE操作でグローバルパーティション分割インデックススキャンを使用します。
---------------------------------------------------------------------------------------EXPLAIN (cost off, verbose on) DELETE FROM gi_ora WHERE b = 198;
DELETE ON public.gi_ora -> グローバル参加インデックススキャン (1/2) gi_ora_b_tableoid_idx ON public.gi_ora 出力: gi_ora.tableid, gi_ora.ctid Index Cond :( gi_ora.b = 198) (4行)
- 指定されたデータのUPDATE操作でグローバルパーティション分割インデックススキャンを使用します。
サンプル結果:EXPLAIN (cost off, verbose on) UPDATE gi_ora SET a = a - 10 WHERE b = 198;
クエリ計画 --------------------------------------------------------------------------------------- UPDATE ON public.gi_ora -> グローバル参加インデックススキャン (1/2) gi_ora_b_tableoid_idx ON public.gi_ora 出力: (gi_ora.a - 10), gi_ora.tableid, gi_ora.ctid Index Cond :( gi_ora.b = 198) (4行)