Oracle Exadataで一部のデータをUPDATE、もしくはDELETEしたい場合、少量のデータであれば問題ないのですが、大量データだと性能に影響がありSQLが全然戻ってこないことがあります。
パーティショニングされているテーブルであれば、下記のEXCHANGEを使った方法によりそれらを高速化することが可能です。
例えば、下記のようなパーティショニングされているテーブルがあり、そのパーティション内の一部データをDELETEしたい場合を想定。
まずは対象パーティションの件数確認
SELECT COUNT(1) FROM SAMPLE_SCHEMA.HOGE_TABLE PARTITION(P_201902);
+-----------+
| COUNT(1) |
+-----------+
| 5 |
+-----------+
CTASで交換用の一時テーブル作成。この時、DELETEしたいデータを一時テーブルに入れないようにSELECT。
CREATE TABLE SAMPLE_SCHEMA.TMP_TABLE
AS
SELECT *
FROM SAMPLE_SCHEMA.HOGE_TABLE PARTITION(P_201902)
WHERE ID != "0003"
;
一時テーブルの件数確認
SELECT COUNT(1) FROM SAMPLE_SCHEMA.TMP_TABLE;
+-----------+
| COUNT(1) |
+-----------+
| 4 |
+-----------+
EXCHANGEでパーティション交換
ALTER TABLE SAMPLE_SCHEMA.HOGE_TABLE EXCHANGE PARTITION P_201902
WITH TABLE SAMPLE_SCHEMA.TMP_TABLE;
対象パーティションの件数確認し、交換されたことを確認する。
SELECT COUNT(1) FROM SAMPLE_SCHEMA.HOGE_TABLE PARTITION(P_201902);
+-----------+
| COUNT(1) |
+-----------+
| 4 |
+-----------+