セグメント縮小とDELETE/TRUNCATEの動作の違いを完全解説!

Oracle Master Silver

Oracleデータベースの効率的な運用には、不要な領域を解放し、パフォーマンスを最適化することが重要です。その中核を担うのが「セグメント縮小(Segment Shrink)」です。一方、セグメント縮小を効果的に利用するには、データ削除の方法(DELETE/TRUNCATE)の違いを正しく理解する必要があります。

本記事では以下の内容を詳しく解説します。

  1. DELETEとTRUNCATEの違い(初心者向けに図解付きで解説)
  2. セグメント縮小の仕組み(視覚的に理解)
  3. 実行手順と注意点(具体的なコマンド例)
  4. 実務に役立つヒントとベストプラクティス
  5. 効果確認方法(SQLスクリプト付き)

1. DELETEとTRUNCATEの違いを詳しく解説

データ削除には、DELETETRUNCATEの2つの主要な方法があります。それぞれの特徴と動作の違いを解説します。

DELETEとは?

  • 部分的なデータ削除が可能 WHERE句を使って、条件に一致する行だけを削除できます。
  • UNDOセグメントを利用 削除データをUNDOセグメントに記録し、ロールバックが可能。
  • 高水位マーク(HWM)はそのまま 削除した領域は未使用状態になりますが、HWMはリセットされないため、セグメントのサイズは変わりません。

TRUNCATEとは?

  • 高速で効率的な全削除 テーブルの全データを即座に削除します。
  • UNDOセグメントを使用しない データ削除のログを記録しないため、ロールバックは不可能です。
  • HWMがリセットされる テーブル全体のブロックが解放され、セグメントサイズが初期化されます。

DELETEとTRUNCATEの違いを図解で理解

+----------------+--------------------------+----------------------------+
| 操作 | DELETE | TRUNCATE |
+----------------+--------------------------+----------------------------+
| 条件の使用 | WHERE句で部分削除可能 | 条件指定不可(全削除のみ) |
| ロールバック | 可能 | 不可能 |
| 高水位マーク | 影響なし(削除前のまま) | リセット |
| 実行速度 | 遅い(ログ記録あり) | 非常に速い(ログ記録なし) |
| UNDOの使用 | 使用する | 使用しない |
| 領域の開放 | されない(縮小が必要) | 即座に開放される |
+----------------+--------------------------+----------------------------+

2. セグメント縮小の仕組みを視覚的に解説

高水位マーク(HWM)とは?

高水位マークは、テーブルやセグメントで使用されるブロックの最後尾を示すポイントです。このマークより後ろの領域は未使用ですが、削除しても自動的に縮小されません。


DELETE後のセグメント状態

[DELETE実行後]
+---------+---------+---------+---------+---------+
| データ | 削除済み| データ | 削除済み| 高水位マーク|
+---------+---------+---------+---------+---------+
  • データは削除されても、ブロックは未使用のまま残ります。
  • セグメント縮小を行わない限り、HWMは下がりません。

TRUNCATE後のセグメント状態

[TRUNCATE実行後]
+---------+---------+---------+---------+---------+
| 空ブロックのみ | 高水位マーク|
+---------+---------+---------+---------+---------+
  • TRUNCATEによって高水位マークがリセットされ、未使用ブロックが即座に解放されます。

3. セグメント縮小の実行手順と注意点

実行手順

  1. ROW MOVEMENTの有効化
    ALTER TABLE テーブル名 ENABLE ROW MOVEMENT;
  2. セグメント縮小の実行
    ALTER TABLE テーブル名 SHRINK SPACE;
  3. 部分縮小(Compactのみ)
    ALTER TABLE テーブル名 SHRINK SPACE COMPACT;
  4. インデックスの縮小
    ALTER INDEX インデックス名 SHRINK SPACE;

注意点

  • UNDO領域の確保:縮小作業中、UNDO領域が一時的に大量に使用されます。
  • パフォーマンスへの影響:縮小操作中はデータベースの負荷が増加するため、ピーク時間を避けて実行してください。
  • オンライン縮小SHRINK SPACEはデータの読み書きを許容しますが、特定のトランザクションには影響を与える可能性があります。

4. 実務に役立つヒント

ヒント1: DELETEと縮小の組み合わせ

  • DELETEを使用する場合は、縮小を必ず実施し、未使用領域を解放しましょう。

ヒント2: TRUNCATEの活用

  • 大量データを削除する場合、TRUNCATEを使用すると、ログ生成を最小化し、削除操作を高速化できます。

ヒント3: アーカイブモードの確認

  • 縮小作業中にREDOログが大量に生成される場合があります。アーカイブモードの設定を確認してください。

5. セグメント縮小の効果確認方法

縮小操作後にその効果を確認するSQLを紹介します。

高水位マークの確認

ANALYZE TABLE テーブル名 VALIDATE STRUCTURE;
SELECT TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE
FROM USER_TABLES
WHERE TABLE_NAME = 'テーブル名';

セグメントサイズの確認

SELECT SEGMENT_NAME, BYTES/1024/1024 AS SIZE_MB
FROM USER_SEGMENTS
WHERE SEGMENT_NAME = 'テーブル名';

縮小前後の比較例

縮小前: 100MB
縮小後: 40MB
効果: 60MBの領域削減

6. 具体的なシナリオと適用例

シナリオ1: 古いデータの削除

  • 売上データの過去5年分を削除。
    DELETE FROM sales WHERE transaction_date < TO_DATE('2019-01-01', 'YYYY-MM-DD');
  • セグメント縮小を実施。
    ALTER TABLE sales SHRINK SPACE;

シナリオ2: 定期的なメンテナンス

  • 月次のバッチ処理後に縮小を実施し、不要領域を回収。

まとめ

DELETEとTRUNCATEの使い分け

  • DELETE:部分的なデータ削除が必要な場合。
  • TRUNCATE:全データ削除を高速に行いたい場合。

セグメント縮小の重要性

  • DELETE後に高水位マークを下げ、ディスク領域を最適化。
  • パフォーマンス向上とリソースの効率的利用に寄与。

セグメント縮小とDELETE/TRUNCATEの正しい使い方を理解し、運用に活かしていきましょう!

[参考]
Oracle Databaseパフォーマンス・チューニング・ガイド 19c

コメント

タイトルとURLをコピーしました