3.

Oracle エクステント (Extent) 完全ガイド(ブロック / セグメント / 自動割当 / Local Management)

編集
この記事の要点
  • エクステント (Extent) は Oracle の連続するデータブロックの集まり
  • ストレージ階層: ブロック ⊂ エクステント ⊂ セグメント ⊂ 表領域 ⊂ DB
  • セグメントが領域を必要とするときはエクステント単位で割り当てられる
  • 管理方式: LOCAL (推奨) — ビットマップで高速管理 / DICTIONARY (旧式)
  • サイズ: AUTOALLOCATE (Oracle が自動決定) と UNIFORM (固定サイズ)

エクステント (Extent) とは

エクステントは Oracle のストレージ単位の 1 つで、連続するデータブロックの集まりです。データ格納の最小割り当て単位として機能し、テーブルやインデックス (セグメント) が領域を必要とするときは、ブロック単位ではなくエクステント単位で割り当てられます。

Oracle のストレージ階層

階層意味典型サイズ
データベース最上位-
表領域論理グループGB 〜 TB
セグメント1 オブジェクト (テーブル等) のストレージMB 〜 GB
エクステント連続ブロックの集まり64KB 〜 MB
ブロックI/O の最小単位8KB (DB_BLOCK_SIZE)

包含関係: 表領域 ⊃ セグメント ⊃ エクステント ⊃ ブロック

なぜエクステントが必要なのか

ブロック 1 つずつ割り当てると頻繁な管理オーバーヘッド断片化が起きます。エクステント単位 (=複数ブロックをまとめて) 確保することで、

  • 連続領域のためシーケンシャル I/O 性能が良い
  • 領域管理のメタデータ量を削減
  • 断片化を抑制

セグメントとエクステントの関係

セグメント (テーブルやインデックス) が作成されると最初のエクステント (INITIAL EXTENT) が割り当てられます。データが増えて領域が足りなくなると次のエクステント (NEXT EXTENT) が追加で割り当てられます。

[ セグメント (テーブル EMP) ]
   ├ エクステント1 (8 ブロック = 64KB)
   ├ エクステント2 (8 ブロック)
   ├ エクステント3 (8 ブロック)
   └ ...

エクステント管理方式

方式説明採用状況
LOCAL表領域のヘッダ部にあるビットマップで管理。高速現代の標準
DICTIONARYデータディクショナリの表で管理。古い方式Oracle 11g 以降は非推奨

新規作成では特別な理由がない限り LOCAL 管理を選びます。表領域作成 DDL では EXTENT MANAGEMENT LOCAL がデフォルト。

エクステント割り当てサイズ

指定挙動
AUTOALLOCATE (推奨)Oracle がセグメントの成長に応じてサイズを自動調整 (64KB → 1MB → 8MB → 64MB)
UNIFORM SIZE n常に同じサイズで割り当て (例: 1M ずつ)
-- AUTOALLOCATE (デフォルト)
CREATE TABLESPACE app_data
    DATAFILE '/u01/.../app_data01.dbf' SIZE 500M
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

-- UNIFORM SIZE (DWH 等で予測可能なサイズに固定したい場合)
CREATE TABLESPACE app_uniform
    DATAFILE '/u01/.../app_uniform01.dbf' SIZE 500M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

セグメントごとのエクステント指定

CREATE TABLE 時のストレージ句でセグメントごとに調整可能 (ただし AUTOALLOCATE 表領域では無視される設定が多い)。

CREATE TABLE big_log (
    log_id   NUMBER,
    msg      VARCHAR2(4000),
    ts       TIMESTAMP
)
TABLESPACE app_data
STORAGE (
    INITIAL     1M           -- 最初のエクステント
    NEXT        1M           -- 以降のエクステント
    MINEXTENTS  1            -- 作成時の最小エクステント数
    MAXEXTENTS  UNLIMITED    -- 最大エクステント数
);

エクステント情報の確認 SQL

-- セグメントごとのエクステント数とサイズ
SELECT
    owner,
    segment_name,
    segment_type,
    extents,
    blocks,
    ROUND(bytes/1024/1024, 2) AS mb
FROM dba_segments
WHERE owner = 'APP_USER'
ORDER BY bytes DESC;

-- 特定セグメントのエクステント詳細
SELECT
    extent_id,
    file_id,
    block_id,
    blocks,
    ROUND(bytes/1024, 1) AS kb
FROM dba_extents
WHERE owner = 'APP_USER'
  AND segment_name = 'BIG_LOG'
ORDER BY extent_id;

-- 表領域の空きエクステント
SELECT tablespace_name,
       COUNT(*) AS free_extents,
       ROUND(SUM(bytes)/1024/1024, 1) AS free_mb,
       ROUND(MAX(bytes)/1024/1024, 1) AS largest_mb
FROM dba_free_space
GROUP BY tablespace_name;

エクステントとブロックの関係

エクステントを構成するブロック数 = エクステントサイズ ÷ DB_BLOCK_SIZE。デフォルトの 8KB ブロックなら 64KB エクステント = 8 ブロックです。

エクステントサイズブロック数 (8KB ブロックの場合)
64KB8
1MB128
8MB1,024
64MB8,192

断片化と再編成

エクステントが多数の領域に散らばると断片化が起こり、全表スキャンの効率が低下することがあります。対策として:

  • ALTER TABLE ... MOVE でテーブルを再構築
  • ALTER INDEX ... REBUILD でインデックスを再構築
  • パーティション化で局所的に対処
  • 表領域単位でUNIFORM SIZE に統一すると断片化が起きにくい (DWH で有効)

FAQ

Q: エクステント数が多くなりすぎると問題は?
A: 現代の LOCAL 管理では問題は小さい (ビットマップで O(1) 管理)。古い DICTIONARY 管理ではディクショナリ更新負荷が問題視された。

Q: AUTOALLOCATE と UNIFORM のどちらを選ぶ?
A: 通常は AUTOALLOCATE でよい。大規模 DWH やパーティション設計で予測可能なサイズにしたいときに UNIFORM。

Q: テーブルを TRUNCATE するとエクステントは?
A: TRUNCATE TABLE はデフォルトで最初のエクステントだけ残し、残りのエクステントは解放される。REUSE STORAGE 句を付けると全エクステントを保持する。

関連

  • 表領域 — エクステントを束ねる論理ストレージ
  • セグメント — 複数エクステントで構成される 1 オブジェクト
  • データブロック — エクステントを構成する最小単位
  • ASSM (Automatic Segment Space Management)
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 表領域
  2. セグメント
  3. エクステント
  4. データブロック

最近更新/作成されたページ