表領域の管理
Oracleでは表やINDEXを表領域(=TABLE SPACE)という論理的な領域に格納してデータを整理する。
物理的にはデータファイルと呼ばれる、1つ以上の論理的なファイルからと対応付けられている。
○SYSTEM表領域
データベース作成時に自動的に作成され、すべてのデータベースに必要とされる。
データディクショナリやストアドプロシージャ、SYSTEMロールバックセグメントなどが含まれる。
オフラインにすることは出来ない。
ここにはユーザオブジェクトは作成しない。
○SYSTEM表領域以外の表領域
表、インデックス、ロールバッグセグメント、一時セグメントを格納する。
特定の用途を持った領域には慣習的にTEMPなどの名前がつけられるが、それは判別しやすいようにであってシステム的な意味合いはない。
オラクル社では、表、インデックス、ロールバッグセグメント、一時セグメントのために、それぞれ専用の表領域を作ることを推奨している。
ディクショナリ管理表領域
領域の使用率の追跡をSQL ディクショナリ表に依存する従来の方法で管理する表領域。
現在のデフォルト設定。ローカル管理表領域
Oracle8iより提供された表領域の種類。
ビットマップを使用して、使用済領域と空き領域が追跡される。
メリット
・ディクショナリによる領域管理操作の回避
・ディクショナリ表の空き領域の競合軽減
・空き領域の結合が不要(ビットマップによる自動追跡)
・エクステント・サイズは自動決定
・ロールバック情報不要(ディクショナリの変更がないため)
一時表領域
Oracle 7.3より提供された表領域の種類。
複数のソート操作で1つのソート・セグメントを共有するため、オーバーヘッドを減少し、効率的にソート操作ができる。
特に、ローカル管理表領域は、再帰的領域管理を低減しデータ・ディクショナリの競合を削減する。また、セッション中はスキーマ・オブジェクトを含むことができ、領域の結合を必要としない。一時表領域には、表などのオブジェクトは格納できない。
Oracle8iより、ディクショナリ管理またはローカル管理を選んで作成できる。
常にNOLOGGINGモードで、読込み専用にはできず、名前は変更できず、ALTER DATABASEコマンドでは生成できず、メディア・リカバリではリカバリされず、BACKUP CONTROLFILEコマンドでは情報は生成されず、CREATE CONTROLFILEコマンドには含まれない。ソート・セグメントは、TEMPORARY表領域を使用する最初の文により作成される。
この一時セグメントは、データベースがシャットダウンしたときに解放される。
・ブロック
Oracleの最小記憶単位。データベース作成時に決定し、後で変更は出来ない。
通常2〜8KB。
・エクステント
連続したデータブロック。Oracleではエクステント単位で領域を割り当てる。→パフォーマンス向上のため
セグメント作成時には1つ以上のエクステントが必要となる。
空き領域があっても、連続していなければエクステントとして確保は出来ない。データファイルをまたがって確保することも出来ない。
セグメントが成長するにつれ、エクステントをセグメントに(自動/手動で)追加できる。
・セグメント
特定のタイプのデータ構造に対して割り当てたエクステントの論理的な集合。
1つ以上のエクステントで構成される。
表領域をまたがることはできないが、同じ表領域に属する複数のファイルにまたがることができる。
※データファイル(物理構造)
データ・ファイルは、オペレーティング・システム・ブロックで構成される物理構造。
データ・ファイルは1つの表領域にのみ属す。
データ・ファイルのサイズは、データファイル内の最終オブジェクトの最終ブロックの下になるように減らすことはできまない。
データベース管理者は、表領域の特徴を活かし、用途に応じて効果的な表領域を作成する必要がある。
CREATE TABLESPACE文を使用する。
代表的なキーワードとパラメータ
tablespace | 作成する表領域の名前 |
filespec | 表領域を構成するデータ・ファイルの名前、サイズを指定する。 REUSEを指定すると、既存のファイルを再利用できる。 |
ONLINE | 作成直後に、オンラインにする。(省略値) |
OFFLINE | 作成直後に、オフラインにする。 |
TEMPORARY | ソート処理専用の一時表領域として作成する。 |
例)次の特性を持つ表領域TBSA を作成する。
新しい表領域のデータには、1 つのデータ・ファイル(サイズは50MB )が含まれる。
この表領域に作成されるすべてのセグメントに対して、デフォルト記憶域パラメータが明示的に設定される。
CREATE TABLESPACE tbsa
DATAFILE '/u02/oracle/data/tbsa01.dbf' SIZE 50M
DEFAULT STORAGE (
INITIAL 50K
NEXT 50K
MINEXTENTS 2
MAXEXTENTS 50
PCTINCREASE 0);○一時表領域の作成
CREATE TABLESPACE 文にTEMPORARY キーワードを指定する。
例)ディクショナリ管理の一時表領域を作成する。
CREATE TABLESPACE sort
DATAFILE '/u02/oracle/data/sort01.dbf' SIZE 50M
DEFAULT STORAGE (
INITIAL 2M
NEXT 2M
MINEXTENTS 1
PCTINCREASE 0)
TEMPORARY;
CREATE TABLESPACE 文のエクステント管理句にLOCAL
を指定する。
UNIFORM SIZE
を指定すると表領域は特定サイズの均一エクステント数を持つように管理される。
代表的なキーワードとパラメータ
AUTOALLOCATE | エクステントは自動的に管理される。 ある程度の領域は無駄になるが、Oracle によって領域が管理されるという利点があり、領域の割当てと割当て解除を厳密に制御しなくてもよい場合等に選択。 |
UNIFORM SIZE | 指定した特定サイズの均一エクステント数を持つように管理される。 未使用領域の厳密な制御が必要で、オブジェクトに割り当てられる領域、オブジェクト、エクステントの数およびサイズを正確に予測できる場合選択。これにより、使用できない領域が表領域に生じなくなる。 |
例)ローカル管理表領域LMTBSB を作成する。この場合、AUTOALLOCATE を指定しているため、エクステント・サイズは自動的に管理される。
CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
例)128KBのエクステント・サイズを指定して、ローカル管理表領域LMTBSB を作成する。128KB の各エクステント(64 個のOracle ブロック)は、このファイルのビットマップに1 ビットで表される。
CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;○一時表領域の作成
CREATE TEMPORARY TABLESPACE文を使用する。
この文を発行するには、CREATE TABLESPACE システム権限が必要。
ローカルに管理される表領域の方が、領域管理がはるかに容易で効率的。ローカルに管理される一時表領域では、一時ファイルが使用される。
常にNOLOGGINGモードに設定されている。例)lmtempという名のローカル管理一時表領域を作成。16MBの各エクステント(8000個のブロック)は、このファイルのビットマップに1 ビットで表される。
CREATE TEMPORARY TABLESPACE lmtemp TEMPFILE '/u02/oracle/data/lmtemp01.dbf'
SIZE 20M REUSE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;注意: ALTER TABLESPACE 文にTEMPORARY キーワードを指定して、ローカルに管理される永続表領域をローカルに管理される一時表領域に変更することはできない。ローカルに管理される一時表領域を作成するには、CREATE TEMPORARY TABLESPACE 文を使用する必要がある。
データベース管理者は、表領域の特徴を活かし、用途に応じて効果的な表領域を作成する必要がある。
ALTER TABLESPACE文を使用する。
代表的なキーワードとパラメータ
tablespace | 変更する表領域の名前 | |
ADD DATAFILE | 追加するデータ・ファイル名を指定する。 | |
RENAME DATAFILE | データ・ファイルの改名 変更前と変更後のファイル名を指定する。 |
|
ONLINE | 表領域をオンラインにする。 | |
OFFLINE | 表領域をオフラインにする。 | |
NORMAL | 全データ・ファイルにチェックポイントを実行する。 | |
TEMPORARY | オフラインになっていないデータ・ファイルに、チェックポイントを実行する。 | |
IMMEDIATE | データ・ファイルに、チェックポイントを実行しない。 | |
TEMPORARY | ソート処理専用の一時表領域として変更する。 | |
READ ONLY | 読み込み専用の表領域として変更する。 |
例)proj1_ts表領域に、10Mバイトのデータ・ファイルを追加。
ALTER TABLESPACE proj1_ts ADD DATAFILE '/u03/data/proj1_added_ts.dbf' SIZE 10M ;
○一時表領域への変更
既存のディクショナリ管理の永続表領域を一時表領域に変更するには、ALTER TABLESPACE文を使用する。
例)tbsaという名の永続表領域を一時表領域に変更。
ALTER TABLESPACE tbsa TEMPORARY;
○一時表領域の変更
永続表領域の場合とほぼ同じキーワードと句を使用して、ディクショナリ管理の一時表領域にALTER TABLESPACE 文を発行。
ローカルに管理される表領域の場合、記憶域パラメータの変更はオプションではなく、使用可能エクステントを合わせる必要はない。
○一時表領域への変更
ローカル管理の永続表領域を、ローカル管理の一時表領域に変更することはできない。
○一時表領域の変更
ALTER DATABASE TEMPFILE文を使用。
例)一時ファイルu02/oracle/data/lmtemp02.dbfのサイズが4MB に変更される。
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' RESIZE 4M;
また、一時ファイルの自動拡張(AUTOEXTEND)と改名(RENAME FILE)もできる。
いずれもALTER TABLESPACE文にONLINE/OFFLINEオプションを使用する。
表領域は、次のような理由の場合はオフライン化することができる。
表領域がオフライン化されると、その関連ファイルがすべてオフライン化される。SYSTEM 表領域をオフライン化することはできない。
表領域オフライン化オプション
NORMAL | 表領域のどのデータ・ファイルにもエラー条件が存在していない場合は、この表領域を通常の方法でオフライン化できる。書込みエラーが発生していると、現時点では表領域のデータ・ファイルをオフライン化することはできない。通常のオフラインの優先順位では、Oracleは表領域のすべてのデータ・ファイルのチェックポイントを取って、データ・ファイルをオフライン化する。 |
TEMPORARY | 表領域の1
つまたは複数のデータ・ファイルについてエラー条件が存在している場合でも、表領域を一時的にオフライン化できる。一時オフラインの優先順位では、Oracleはまだオフライン化されていないデータ・ファイルのチェックポイントを取って、これらのファイルをオフライン化する。 オフラインになっているファイルがないときに表領域を一時的にオフライン化する場合は、表領域をオンラインに戻す前にメディア・リカバリをする必要はない。ただし、表領域の1つまたは複数のファイルが書込みエラーのためにオフラインになっており、この表領域を一時的にオフライン化する場合は、表領域をオンラインに戻す前にリカバリをする必要がある。 |
IMMEDIATE | 表領域を即時にオフライン化する場合は、Oracle がデータ・ファイルのチェックポイントを取る必要はない。即時オフラインの優先順位では、表領域をオンラインに戻す前に、表領域のメディア・リカバリが必要となる。データベースをNOARCHIVELOG モードで運用している場合、表領域を即時にオフライン化することはできない。 |
FOR RECOVER | リカバリ・セット内の実働データベースの表領域が、表領域のPoint-in-Time リカバリのためにオフライン化される。 |
注意:表領域をオフライン化する必要がある場合、可能であればNORMALオプション(デフォルト)を使用する。これにより、表領域をオフライン化してからオンラインに戻すまでに、REDOログ順序が(不完全メディア・リカバリ後にALTER DATABASE OPEN RESETLOGS文を使用して)リセットされたとしても、表領域のリカバリを必要とすることなく、オンライン化できることが保証される。
表領域を通常どおりにオフライン化できない場合に限り、TEMPORARY を指定する。この場合、エラーが原因でオフライン化されたファイルのみをリカバリすると、表領域をオンライン化できる。IMMEDIATE は、NORMAL オプションとTEMPORARY オプションを試した後にのみ指定。
例)USERS 表領域を通常の方法でオフライン化する。
ALTER TABLESPACE users OFFLINE NORMAL;
オンライン状態の表領域をオフライン化する前に、次のことに注意。
Oracle データベースがオープンされていれば、いつでもデータベース内の任意の表領域をオンライン化できる。通常、表領域は、データベース・ユーザーがその中のデータを使用できるようにオンラインになっている。
注意:オンライン化しようとする表領域が、「明らかに」(ALTERTABLESPACE OFFLINE 文のNORMAL オプションを使用して)オフラ
イン化されていない場合、最初にメディア・リカバリをしない限りオンライン化できない。メディア・リカバリをしないと、エラーが戻されて表領域はオフラインのままになる。
例)USERS 表領域をオンライン化する。
ALTER TABLESPACE users ONLINE;
DROP TABLESPACE文を使用。
代表的なキーワードとパラメータ
tablespace | 削除する表領域の名前 |
INCLUDING CONTENTS | 表領域内のものをすべて削除する。 |
CASCADE CONSTRAINTS | 削除する表領域以外のオブジェクトを参照している場合、その参照整合性制約を削除する。 |
例) 表領域の削除
DROP TABLESPACE proj1_ts INCLUDING CONTENTS ;
注意;表領域を削除しても、ファイルはディスクから削除ず、データ・ディクショナリの管理情報や、制御ファイルが更新されるだけ。
オペレーティング・システム・コマンドを使用して、ファイルを削除する必要がある。
○一時ファイルの削除(ローカル管理)
ALTER DATABASE TEMPFILE文を使用。
例)
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP;
記憶領域(STORAGE)パラメータとは、表や索引などのオブジェクトを作成した時に、そのオブジェクトのために、どのくらいの大きさの領域をいくつ確保するかなどを設定する。
オブジェクトの格納領域を管理することができる。
記憶領域(STORAGE)パラメータの値は、複数箇所で指定できる。
オブジェクトを作成した時に、どこで設定した値が採用されるかは、次の優先順位に基づいて決定される。
DEFAULT STORAGEパラメータは、CREATE TABLESPACE文でもALTER TABLESPACE文で設定できる。
代表的なキーワードとパラメータ
INITIAL | 初期エクステントの大きさをバイト単位で指定する。 |
NEXT | 2番目のエクステントの大きさをバイト単位で指定する。 |
PCTINCREASE | 3番目以降のエクステントの大きさを決める時に使用する成長率。 成長率で指定したパーセントの割合で、エクステントは大きくなる。 成長率 0(ゼロ)% は、NEXTエクステントと同じ大きさを意味する。 システム・デフォルトは、50 %。 |
MINEXTENTS | オブジェクト作成時に作られるエクステントの数。 |
MAXEXTENTS | オブジェクトに割り当てることが可能なエクステントの最大数 無制限の場合は、UNLIMITED を指定する。 |
例)次の特性を持つ表領域proj2_tsを作成する。
3Mバイトのデータ・ファイルを持ち、最初に500Kの大きさのエクステントを1つ割り当て、
500Kバイトで足りない場合は、700Kバイトのエクステントが、随時追加される。CREATE TABLESPACE proj2_ts
DATAFILE '/u03/data/proj2_ts.dbf'
SIZE 3M
DEFAULT STORAGE ( INITIAL 500K NEXT 700K
MINEXTENTS 1 PCTINCREASE 0 );注意: MINIMUM EXTENTが指定されている場合、表領域内に割り当てられるエクステントは、それぞれMINIMUM EXTENTの倍数に指定する必要がある。
オブジェクトの特性と比べて、INITIALやNEXTが小さすぎると、多くのエクステントが発生し、パフォーマンスに影響を及ぼす場合がある。
また、INITIALやNEXTが大きすぎると、領域の浪費になる。
デフォルトの記憶域パラメータや最小エクステント・サイズを指定できない。
AUTOALLOCATE
を指定すると、表領域はシステム管理になり、最小エクステント・サイズは64KBとなる。
UNIFORM SIZE を指定すると、表領域は指定したSIZEの均一サイズのエクステントを持つように管理される。
デフォルトSIZE は1MB 。
ローカルに管理される表領域内でセグメントを割り当てると、記憶域句はディクショナリ管理の表領域とは異なる方法で解析される。ローカルに管理される表領域内でオブジェクトを作成すると、INITIAL、NEXT およびMINEXTENTSパラメータを使用して、そのオブジェクトのセグメントの初期サイズが計算される。
表や索引の作成や削除を繰り返すと、表領域が断片化し、パフォーマンスが悪くなる場合がある。
断片化を改善するためには、Oracle Enterprise Managerの機能を使用したり、SQLコマンドを使用する。
ローカル管理表領域の場合、断片化を改善する必要はない。
連続していない空きエクステントは、次の方法で結合できる。
例)proj2_ts表領域の空き領域を結合し、連続する大きなエクステントに結合する。
ALTER TABLESPACE proj2_ts COALESCE ;注意;COALESCEオプションは排他的なので、ALTER TABLESPACE文の他のオプションと、同時に指定することはできない。
DBA_FREE_SPACE およびDBA_FREE_SPACE_COALESCEDビューを使用して、空き領域を監視し、結合アクティビティの統計情報を表示できる。
次の文では、表領域TABSP_4の空き領域を表示す。
SELECT block_id, bytes, blocks
FROM dba_free_space
WHERE tablespace_name = 'TABSP_4'
ORDER BY block_id;
結合アクティビティの統計情報を表示すには、DBA_FREE_SPACE_COALESCED ビューを使用する。 このビューは、領域を合わせる必要があるかどうかを判断する場合にも役立つ。
V$TABLESPACE | 制御ファイルからのすべての表領域の名前と番号 |
DBA_TABLESPACES USER TABLESPACES |
すべての(またはユーザーがアクセス可能な)表領域の説明 |
DBA_SEGMENTS USER_SEGMENTS |
すべての(またはユーザーがアクセス可能な)表領域内のセグメントに関する情報 |
DBA_EXTENTS USER_EXTENTS |
すべての(またはユーザーがアクセス可能な)表領域内のデータ・エクステントに関する情報 |
DBA_FREE_SPACE USER_FREE_SPACE |
すべての(またはユーザーがアクセス可能な)表領域内の使用可能エクステントに関する情報 |
V$DATAFILE | 所有する表領域の表領域番号など、すべてのデータ・ファイルに関する情報 |
V$TEMPFILE | 所有する表領域の表領域番号など、すべての一時ファイルに関する情報 |
DBA_DATA_FILES | 表領域に属するファイル(データ・ファイル)を表示 |
DBA_TEMP_FILES | 一時表領域に属するファイル(一時ファイル)を表示 |
V$TEMP_EXTENT_MAP | すべてのローカル管理一時表領域内のすべてのエクステントに関する情報 |
V$TEMP_EXTENT_POOL | ローカル管理一時表領域の場合:キャッシュに送られ各インスタンスに使用される一時領域の状態 |
V$TEMP_SPACE_HEADER | 各一時ファイルの使用済/空き領域を表示 |
DBA_USERS | すべてのユーザーのデフォルト表領域と一時表領域 |
DBA_TS_QUOTAS | すべてのユーザーの表領域割当て制限を表示 |
V$SORT SEGMENT | 特定インスタンス内のすべてのソート・セグメントに関する情報。このビューは、表領域がTEMPORARY タイプの場合にのみ更新される |
V$SORT_USER | ユーザーおよび一時/永続表領域に使用される一時ソート領域 |
例)データベース内のすべての表領域の名前とデフォルト記憶域パラメータをすべて記述するには、DBA_TABLESPACES ビューに対して次の問合せを使用。
SELECT tablespace_name "TABLESPACE",
initial_extent "INITIAL_EXT",
next_extent "NEXT_EXT",
min_extents "MIN_EXT",
max_extents "MAX_EXT",
pct_increase
FROM dba_tablespaces;
例)データ・ファイルの名前、サイズおよびデータベースの対応する表領域を記述するには、DBA_DATA_FILES ビューに対して次の問合せを入力。
SELECT file_name, blocks, tablespace_name
FROM dba_data_files;
例)データベース内の各表領域について、使用可能エクステントと結合アクティビティの統計を生成するには、次の問合せを入力する。
SELECT tablespace_name "TABLESPACE", file_id,
COUNT(*) "PIECES",
MAX(blocks) "MAXIMUM",
MIN(blocks) "MINIMUM",
AVG(blocks) "AVERAGE",
SUM(blocks) "TOTAL"
FROM sys.dba_free_space
WHERE tablespace_name = 'SYSTEM'
GROUP BY tablespace_name, file_id;
2001/07/20 担当:R.S