ORACLEでの領域計算について教えてください

このQ&Aのポイント
  • ORACLEでCREATE TABLE文を実行する時の領域の計算方法について教えてください。
  • テーブル作成時の領域計算方法は、1レコードのバイト数×必要件数を計算すれば良いです。
  • PCTFREE、PCTUSED、INITIAL、NEXT、MINEXTENTS、MAXEXTENTSなどのパラメータについても知りたいです。
回答を見る
  • ベストアンサー

ORACLEでの領域計算

ORACLEでCREATE TABLE文を実行する時の領域の計算方法 について教えてください。 サンプル PCTFREE 10 PCTUSED 80 STORAGE (INITIAL 2000K NEXT 1000K MINEXTENTS 1 MAXEXTENTS 120 PCTINCREASE 0); で INITIAL は初期値で NEXTは増分値 MINEXTENTSは拡張最小回数 MAXEXTENTSは拡張最大回数 PCTINCREASEは良くわかりませんが、0にしておけば問題ないと書いてありました。 PCTFREE、PCTUSEDは良くわかりません。 テーブルを作成する時に1レコードのバイト数と、必要件数は分かります。 計算方法としては、1レコードのバイト数×必要件数を単純に計算すればよろしいのでしょうか? 増分値はあふれた場合に1回に拡張する値を指定すればいいのでしょうか? あと、MAXEXTENTSは最大増分回数は意味があっていれば理解できますが、MINEXTENTSを指定する理由がわかりません。 PCTFREE、PCTUSEDは良く分かりません。通常はどんな値を指定するのでしょうか? その他、テーブルを作成するにあたり注意するべき点が ありましたら、ご指摘ください。 また、関連するURLがありましたら、教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > PCTINCREASEは良くわかりませんが、0にしておけば > 問題ないと書いてありました。 その方が票領域のフラグメンテーションが発生 しにくいですね。 PCTINCREASE は、エクステントサイズの増加率です。 例えば先のサンプルで、PCTINCREASE=50 と設定してあると、 第1エクステントサイズ=INITIAL=2000K 第2エクステントサイズ=NEXT=1000K 第3エクステントサイズ=NEXT*1.5=1500K 第4エクステントサイズ=NEXT*1.5*1.5=2250K となります。 > PCTFREE、PCTUSEDは良くわかりません。 PCTFREE は、UPDATE 文でデータ長が増えることを想定して、 予め確保しておく予備領域の割合です。 → つまり、最初のINSERT 文でデータを投入する際には、   各ブロックにPCTFREE (%) 分の空き領域が取られます。 PCTUSED は逆にデータが削除されていった時に、 ブロック内のデータ使用率がPCTUSED (%) を下回るまで 新しい行が追加されないと言う指定です。 PCTFREE/PCTUSED については、管理者ガイドに説明があります。 ユーザ登録が必要ですが、OTN Japan でPDF 形式のマニュアルを 公開していますので、こちらでDownload されてはいかがでしょうか? > 計算方法としては、1レコードのバイト数×必要件数を単純に > 計算すればよろしいのでしょうか? まずは、各データブロックには、管理用の領域とPCTFREE 分の 空き領域が取られます。 管理用の領域は、Oracle のバージョンによっても異なりますが、 100Byte 前後と思ってください。 (管理領域よりも、PCTFREE とかの方が影響が大きいので) (ブロックサイズ - 管理領域) * (1-(PCTFREE/100)) がデータを格納できる領域サイズです。 領域サイズが分かったら、1ブロックに何レコード格納 できるか計算して下さい。 1ブロックに格納できるレコード数が分かったところで、 最終的なレコード数から必要なブロック数を求めます。 > 増分値はあふれた場合に1回に拡張する値を > 指定すればいいのでしょうか? INITIAL エクステントに収まりきれなかった時に、次に獲得する エクステントサイズを指定します。 > MINEXTENTSを指定する理由がわかりません。 運用を開始してから、動的エクステントの拡張が起きないように 事前に必要なエクステントを獲得しておくために指定します。 Oracle には、1つのエクステントサイズが2GB を超えられない と言う制限がありますので、大規模表ではこれを指定して 事前にエクステントを割り当ててしまいます。 > PCTFREE、PCTUSEDは良く分かりません。 > 通常はどんな値を指定するのでしょうか? 表の性質によって違いますので、詳しくはマニュアル で確認して下さい。 > その他、テーブルを作成するにあたり注意するべき点が > ありましたら、ご指摘ください。 INITRANS, MASTRANS, FREELISTS, FREELIST GROUPS 等のパラメータがあります。 こちらもマニュアルで確認してみて下さい。

参考URL:
http://otn.oracle.co.jp/
Ref16570
質問者

お礼

ご回答ありがとうございます。 お礼が遅れて申し訳ありません。 PCTINCREASE、PCTFREE、PCTUSED等、 かなり理解でしました。 本屋さんにも行っていろいろと立ち読みもして だいぶ分かってきました。 分かりやすい長文のご回答、 大変ありがとうございました。 感謝いたします。

関連するQ&A

  • TABLE作成のパラメータ

    Oracle勉強中です。皆様の知恵をお貸し下さい。 テーブル作成の最適なパラメータを調査したいと思っています。 調査対象項目は以下です。 「PCTFREE」「PCTUSED」「INITIAL」「NEXT」 「PCTINCREASE」「MAXEXTENTS」 【構成】 DATANO    VARCHAR2(16)  NOT NULL START_DATE  DATE END_DATE   DATE INFO     VARCHAR2(256) ・データ件数…MAX10000件 ・INSERT、UPDATEが月に10000件発生(MAXで) ・DELETEも月に10000件発生(MAXで) ・月次バッチで1ヶ月以上前のレコードを削除 自分なりに出してみたのですが… ・「PCTFREE」→20 更新処理が発生する為 ・「PCTUSED」→50 削除処理が発生する為 ・「MAXEXTENTS」→4096 今後TABLEサイズが大きくならない為にデフォルトを設定(自信ナシです) …正しい値が出せてますでしょうか? 他のパラメータ値の設定方法も合わせてご回答頂ければと思います。 足りない情報等、ご指摘頂ければ補足致します。 よろしくお願いします。

  • oracle表領域作成の際に使用するオプション

    以下の(1)~(9)オプションの意味を、ORACLE初心者でも理解できるレベルで教えていただけないでしょうか? (1)tablespace AAAAAAAAA =表領域名 (2)pctfree 10 =この割合を超えるとブロックに挿入不可能になる。 (3)pctused 80 =用済領域のうち、データブロックごとに確保される最小限の割合。この割合を下回ると挿入可能な ブロックとなる。 (4)initrans 1 (5)storage( (6)initial 1M (7)next 1M (8)maxextents UNLIMITED (9)pctincrease 0 ) 自分で調べてはみたものの、理解できませんでした。 わがままな質問で申し訳ございません。 ご教授願います。

  • インポート時のエラーについて

    新サーバーのOracleにTABLESPACEを作成したのですが、旧サーバーで保管したデータをインポートしようとすると一部件数の多いテーブルでエラーが発生します。内容は IMP-00003:Oracleエラー:1562が発生しました。 ORA-01562:ロールバックセグメント番号:2を拡張できません。 ORA-01628:最大エクステント:121に達しました(ロールバックセグメント:RB1)。 IMP-00028:前の表の部分インポートがロールバックされました(XXXXX行)。 データ用TABLESPACEはサイズ5GBで DEFAULT STORAGE(INITIAL 1024K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 121 PCTINCREASE 50) TEMP用とROLLBACK用TABLESPACEはそれぞれサイズ500MBで DEFAULT STORAGE(INITIAL 1M NEXT 1M MINEXTENTS 1 MAXEXTENTS 512 PCTINCREASE 50) ロールバックセグメントは3つ作成し、それぞれ initial 3M next 3M optimal 50 M  で作成しました。 Oracleは7.3です。設定の間違いや、対策はないでしょうか?

  • CreateTableのオプション確認方法

    以下のCREATE文を実行し、設定されたオプションが正しく設定されていることを確認したいのですが、確認方法がわかりません。どうかご教授願います。 以下のSQLで確認した結果、PCT_USED等が表示されませんでした。 このSQLで上記を確認できる場合、表示されない項目は何か理由があるのでしょうか? ---------------------------------------------------------------- 確認SQL SELECT OWNER ,TABLE_NAME ,TABLESPACE_NAME ,PCT_FREE ,PCT_USED ,INI_TRANS ,INITIAL_EXTENT ,NEXT_EXTENT ,MAX_EXTENTS ,PCT_INCREASE FROM dba_tables ----------------------------------- CREATE TABLE free_table( old_name VARCHAR2(5), new_name VARCHAR2(5) ) tablespace TESTDAT01 pctfree 20 pctused 70 initrans 1 storage( initial 1M next 1M maxextents UNLIMITED pctincrease 0 ) ---------------------------------- 確認したい値 tablespace TESTDAT01 pctfree 20 pctused 70 initrans 1 storage( initial 1M next 1M maxextents UNLIMITED pctincrease 0 ------------------------------ どうかご教授よろしくお願いします。

  • Oracle8iのBLOBに画像を登録する方法

    お世話になります。 現在以下のテーブルに画像を取り込むことを行っているのですが、SQL/PLUS等のコマンドで登録する場合どのようなコマンドになるでしょうか? CREATE TABLE Book (No Number(2) NOT NULL, BookName Varchar2(100) NOT NULL, BookAuthor Varchar2(100) NOT NULL, Genre Number(2) NOT NULL, image BLOB, constraint pk_Books primary key(No))TABLESPACE usertsp PCTFREE 5 PCTUSED 90 STORAGE(INITIAL 10k NEXT 1k PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS UNLIMITED); BLOB型のフィールド(image)に画像を取り込む方法をご存知の方 よろしくお願いします。

  • CreateTable時のInitialエクステントについて

    以下のようにテーブルスペースとテーブルを作成すると空のテーブルなのにエクステントが2つ発生するのですが、なぜでしょうか? CreateTableではInitialエクステントが1つ発生するだけではないのでしょうか? ご回答をお願いします。 バージョン:Oracle9.2.0.1.0 CREATE TABLESPACE GOMI DATAFILE '/export/home/dbf/user_data_gomi.dbf' SIZE 32M REUSE MINIMUM EXTENT 1K DEFAULT STORAGE ( INITIAL 512K NEXT 512K PCTINCREASE 0 MINEXTENTS 1 ); ========================================= CREATE TABLE GOMI_T ( NAMAE VARCHAR2(60) ) PCTFREE 0 TABLESPACE GOMI STORAGE ( INITIAL 128K NEXT 16K MINEXTENTS 1 ); SQL> L 1 SELECT SUBSTR(SEGMENT_NAME,1,8) "SEGMENT",EXTENT_ID,BYTES,BLOCKS 2 FROM DBA_EXTENTS 3* WHERE TABLESPACE_NAME = 'GOMI' SQL> / SEGMENT EXTENT_ID BYTES BLOCKS ---------------- ---------- ---------- ---------- GOMI_T 0 65536 32 GOMI_T 1 65536 32 ↑エクステントが2つ発生する。

  • Oracleテーブル作成について

    Oracle初心者です。 表領域 TEST_TABLESPACEがあるとします。 (サイズは、1024Mと仮定) (1)この表領域に一つのテーブル TEST_TABLEを作成します。 (サイズは、INITIAL 512M NEXT 512M) ここで質問なのですが、例えば上記でテーブルの NEXTを600Mとかにすると、データが512M以上入って NEXTのサイズが拡張された場合、エラーが発生するのか それとも、最大の512Mが拡張され、1024M分のデータが 入らない限り、エラーが発生しないのか? 教えていただけますか? (2)テーブル作成のDDL内でSTORAGE句指定しない場合、 INITIALとかNEXTは、どう設定されますか? 長々と申し訳ないですが、よろしくお願いいたします。

  • 「Oracle 9i」について

    「Oracle 1.7.3.4」でエクスポートしたデータを、 「Oracle 9i」にインポートした後、 参照すると最後のデータの値がおかしくなってしまいます。 (今のところわかっているのは、8と9が2に変わることです。) レコードの最後がCOMP-3で終わっているのがいけないのでしょうか? よくわからないので、どなたか教えて頂けないでしょうか? (例) *テーブルのレイアウト* CREATE TABLE DB (DB_REC VARCHAR2(21), DB_KEY1 VARCHAR2(9), DB_KEY2 VARCHAR2(1)) TABLESPACE DB_TSPACE STORE (INITIAL 300K NEXT 100K MINEXTENTS 1 MAXEXTENTS 10 PCTINCREASE 0 ); *コピー句* 01 DB-REC. 03 DB-KEY. 05 DB-KEY1 PIC 9(09). 05 DB-KEY2 PIC 9(01). 03 DB-KBN PIC X(01). 03 DB-INYMD PIC 9(08) COMP-3. 03 DB-OUTYMD PIC 9(08) COMP-3. です。よろしくお願いします。

  • ORACLEのインデックスについて

    現在、ORACLE9を使用しているのですが INDEXについて理解できないことがあったので 教えてください。 組織、社員という2つしか項目を持たない 従業員という表があり600件ほどのデータがあります。 変更前は、 ・組織、社員にユニークインデックスは作成されていた。 ・600件ほどのデータの組織は全て同一。 となっており、その状態で select * from 従業員 where 組織 = 'ALL' and 社員 = '001' を流すとFULL SCANになっていました。 FULL SCANを回避できないかと思い、社員のみのインデックスを 追加し(* 一番下にインデックス追加時のSQLをはっています)  select * from 従業員 where 組織 = 'ALL' and 社員 = '001' を流すと追加したインデックスを読んでいました。 既に作成されていたユニークインデックスと異なるインデックスが 追加されたのかと思い、DBA_INDEXESの中を確認しましたが 異なっているのは、 ・UNIQUENESS ・INITIAL_EXTENT(ユニークインデックスは24576、  追加したインデックスは40960) ・LEAF_BLOCKS(ユニークインデックスは3、  追加したインデックスは2) の3点のみでした。 なぜこのような動きになるか理解できず、今後の対応に 迷っています。 ・原因 ・調査したらいい場所 ・参考資料 などがありましたら教えてください。 よろしくお願いします。 (*) インデックス追加時のSQL文は、create index 従業員A on 従業員 (社員) tablespace index storage (initial 40000 next 100000 maxextents unlimited pctincrease 0) pctfree 10となっています。

  • 「ORA-12913: ディクショナリ管理表領域を作成できません」について

    AというサーバーのオラクルデータをダンプしてBというサーバーにデータ移行を 行っていますがうまくできません。 約1週間、調べて実行して失敗を繰り返しています。 ちゃんとオラクルを触るのは今回が初めてです。 以下の表領域のCREATE文はimpコマンドに「SHOW」オプションを「Y」にして実行した際に 出力されたものから抜き出しました。 CREATE TABLESPACE "DATA_A" BLOCKSIZE 8192 DATAFILE 'D:\oracle\oradata\...\DATA01.DBF' SIZE 5541M REUSE AUTOEXTEND ON NEXT 1048576 MAXSIZE 32767M, 'D:\oracle\oradata\...\DATA02.DBF' SIZE 6191M REUSE AUTOEXTEND ON NEXT 1048576 MAXSIZE 32767M EXTENT MANAGEMENT DICTIONARY DEFAULT NOCOMPRESS STORAGE ( INITIAL 524288 NEXT 524288 MINEXTENTS 8 MAXEXTENTS 2147483645 PCTINCREASE 50 ) ONLINE PERMANENT NOLOGGING; 上記のCREATE文を実行したら下記のエラーが発生して作成できませんでした。 「ORA-12913: ディクショナリ管理表領域を作成できません」 オラクルのバージョンは「9.2.0.1.0」です。 9.2から表領域を作成するSQLが変わったという記事を読みました。 どのように変わったのかがいまいちわかりません。 申し訳ありませんがご教授いただけませんでしょうか。 宜しくお願いします。