テーブルのメンテナンス
テーブルから不要なデータを削除する場合にはDELETE文を実行します。一方ででテーブルの表領域を移動する場合や再構成するためにはALTER TABLE MOVE文を実行します。
ALTER TABLE MOVE文は表領域の指定を行わなずに、同一表領域内でテーブルの再構成を行う場合にも実行できます。Oracle Database 12cではこのデータの移動と不要データの削除を同時に行うALTER TABLE MOVE INCLUDING ROWS文がサポートされました。
実行例
使い方は簡単です。ALTER TABLE MOVE文に残すレコードを示す条件文を指定します
(マニュアル https://docs.oracle.com/cd/E82638_01/SQLRF/ALTER-TABLE.htm#GUID-552E7373-BF93-477D-9DA3-B2C9386F2877)。
例1 特定のレコードのみ残して同一表領域内で再構成
下記の例では、30日より前のレコードを削除しています。
SQL> ALTER TABLE orders MOVE INCLUDING ROWS WHERE order_date >= to_date(sysdate - 30) ;
例2 パーティションのマージ
下記の例では、パーティション h1_2018とh2_2018を、パーティション y2018にマージしています。その際にorder_status列がNULLのレコードを削除しています。
パーティションのマージだけでなく、パーティションのスプリットや、通常のテーブルからパーティション・テーブルへの変換時にもINCLUDING ROWS句を指定することができます。
SQL> ALTER TABLE orders MERGE PARTITION h1_2018, h2_2018 INTO PARTITION y2018
INCLUDING ROWS order_status IS NOT NULL ;
例3 表領域の移動
下記の例では、パーティション y2017を表領域pastに移動しています。その際にorder_status列がNULLのレコードを削除しています。
SQL> ALTER TABLE orders MOVE PARTITION y2017 TABLESPACE past
INCLUDING ROWS order_status IS NOT NULL ;
オプションの指定
ALTER TABLE MOVE文が素晴らしいのは、ONLINE指定が可能であることとデータの移動にNOLOGGINGが指定できることです。この機能により大量データの移動を運用中に、高速に行うことができます。
例4 NOLOGGINGとONLINE指定
SQL> ALTER TABLE orders MOVE ONLINE NOLOGGING INCLUDING ROWS WHERE order_date >= to_date(sysdate - 30) ;