ローカルエクステントマネージメントに関する検証 その8

~ローカルエクステントマネージメントに関する検証 その8~
ペンネーム ちゃむ

————————————————————————–
8iからの新機能ローカルエクステントマネージメントを以下「LOCAL」と呼ぶ。
従来のデータディクショナリーでエクステントを管理する方法を以下「DICTIONARY」
と呼ぶ。
————————————————————————–

前回は、「パフォーマンス」に関するメリットを検証した。
今回は、「LOCAL」上に一時表領域を作成する方法と「LOCAL」に対して操作をする
DBMS_SPACE_ADMIN PACKAGEの一部を紹介する。

<「LOCAL」にTEMPORARY TABLESPACEを作成する方法>

ソートなどで使用する一時表領域を「LOCAL」に作ってみよう。ソート領域の
特徴を考えると割当て、解放のパフォーマンスの優れている「LOCAL」にはもってこ
いである。

「DICTIONARY」の専用一時表領域

CREATE TABLESPACE TEMP_D DATAFILE '/mnt1/temp_d'
SIZE 10M TEMPORARY;

「LOCAL」の一時表領域

CREATE TEMPORARY TABLESPACE TEMP_L TEMPFILE '/mnt1/temp_l'
SIZE 10M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M;

構文に違いがあるので、注意してほしい。(とくに「TEMPFILE」という記述)
また、「LOCAL」の一時表領域では、「AUTOALLOCATE」句は使用できないようである。
(「ORA-25139: CREATE TEMPORARY TABLESPACEには無効なオプションです。」という
エラーが発生する。)

また、テーブルスペースはおなじみのdba_tablespacesで確認できるが、
「LOCAL」の一時表領域のデータファイルは、v$datafileでは確認できない。
これは、v$tempfileでしか確認できないので注意が必要である。
(v$datafileでバックアップ対象ファイルを決めているサイトもあるだろうから。)

<テーブルスペースの確認>

SELECT TABLESPACE_NAME FROM DBA_TABLESPACES 
WHERE TABLESPACE_NAME IN ('TEMP_L','TEMP_D');

TABLESPACE_NAME
---------------
TEMP_D
TEMP_L

<データファイルの確認 /mnt1/temp_lは出力されない>

SELECT NAME FROM V$DATAFILE WHERE NAME IN ('/mnt1/temp_d','/mnt1/temp_l');

NAME
------------
/mnt1/temp_d

<テンプファイルの確認 /mnt1/temp_dは出力されない>

SELECT NAME FROM V$TEMPFILE WHERE NAME IN ('/mnt1/temp_d','/mnt1/temp_l');
------------
/mnt1/temp_l

<DBMS_SPACE_ADMIN PACKAGE>

DBMS_SPACE_ADMINは「LOCAL」に対して操作をするPL/SQLで書かれたパッケージで
ある。今回は、この中で「LOCAL」→「DICTIONARY」や「DICTIONARY」→
「LOCAL」に変更するプロシージャーを紹介する。

8.1.5より使用可能
「LOCAL」→「DICTIONARY」 TABLESPACE_MIGRATE_FROM_LOCALプロシージャー
8.1.6より使用可能
「DICTIONARY」→「LOCAL」 TABLESPACE_MIGRATE_TO_LOCALプロシージャー

つまり、8.1.5では「LOCAL」→「DICTIONARY」はできるが、「DICTIONARY」→
「LOCAL」には変更できないということである。(8.1.6から双方向で変更可能)
また、これら2つのプロシージャーは、SYSTEM表領域と一時表領域では使用できない。

<使用方法>
TABLESPACE_MIGRATE_FROM_LOCAL(‘テーブルスペース名’)
TABLESPACE_MIGRATE_TO_LOCAL(‘テーブルスペース名’,’割当て単位’,’相対ファイル番号’)

「TABLESPACE_MIGRATE_TO_LOCALに与えるパラメータの意味」

「割当て単位」

デフォルトは表領域の全エクステントの最大公約数に基づいて自動計算される。
明示的に指定する場合は、システムが計算した値の因数にする必要がある。
これを守らないと「ORA-03241: 単位サイズが無効です。」というエラーが発生する。
まあ、デフォルトで問題ないであろう。

「相対ファイル番号」

複数のファイルでテーブルスペースを構成している場合、目的のファイルにビット
マップを配置。これも、デフォルトで問題ないであろうが、ビットマップを作成する
空領域が無い場合は、ここで明示的に指定したり、空領域を増やさなければならない。

では実際に、「LOCAL」→「DICTIONARY」、「DICTIONARY」→「LOCAL」を行なっ
てみよう。まずは「LOCAL」で作成する。

CREATE TABLESPACE CHG DATAFILE '/mnt1/chg' SIZE 1024k
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 8K;

(テーブルスペースのタイプを確認するSQL)

SELECT TABLESPACE_NAME,EXTENT_MANAGEMENT,ALLOCATION_TYPE
 FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'CHG';

TABLESPACE_NAME  EXTENT_MANAGEMENT  ALLOCATION_TYPE
----------------------------------------------------
CHG              LOCAL              UNIFORM

<SQLPLUSより 「LOCAL」→「DICTIONARY」>

SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('CHG');

(テーブルスペースのタイプを確認するSQL)

TABLESPACE_NAME  EXTENT_MANAGEMENT  ALLOCATION_TYPE
----------------------------------------------------
CHG              DICTIONARY         USER

<SQLPLUSより 「DICTIONARY」→「LOCAL」>

SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL('CHG');

(テーブルスペースのタイプを確認するSQL)

TABLESPACE_NAME  EXTENT_MANAGEMENT  ALLOCATION_TYPE
----------------------------------------------------
CHG              LOCAL              USER

EXTENT_MANAGEMENT=LOCAL でかつ ALLOCATION_TYPE=USER のものは、
TABLESPACE_MIGRATE_TO_LOCALで変更したものである。
(初めから「LOCAL」の場合は、ALLOCATION_TYPE=UNIFORMまたはSYSTEMである。
~ローカルエクステントマネージメントに関する検証 その1~参照のこと)

12月14日(木)、15日(金)に開催されるORACLE OPEN WORLD(東京ドーム)へ
の出展が決まりました。当日、弊社の技術情報がぎっしり詰まった冊子をお配り
します。その冊子の中でしか読めない「検証生活ネタ」もございますのでお楽しみ
に!!

以上 雨が降り出した 茅ヶ崎にて