• 締切済み

テーブル作成について

はじめまして。おしえてください 初めてOracleでテーブルを作成します。 そのときにPCTFREE、PCTUSE、PCTINCREASEの設定 をするのですが、これはなんですか? これを設定する際に気をつけたらいいことをおしえてください。 お願い致します。

みんなの回答

  • msystem
  • ベストアンサー率42% (79/186)
回答No.2

前回の回答にも、書きましたが、PCTFREE、PCTUSEは、テーブルのデータに対し、Updateを使うかどうかによります。補足の文面をそのまま取りますと、Updateはほとんど影響ないことになりますので(今週のデータを先週のデータに変更する作業が、NULLが入っている列にフラグ用に何かデータを入れるという作業でない場合)、そのような場合、PCTFREEはできるだけ小さく、PCTUSEはできるだけ大きくとるのが、パフォーマンス的には良いことになりますので、PCTFREEには5ぐらい、PCTUSEは90くらいをお勧めします。(Oracleの仕様で、PCTFREE+PCTUSE<100という決まりがありますので気をつけてください) あと、先週のデータを削除し、今週のデータを先週のデータに変更し、新たに今週のデータを追加するという作業の流れを見ると、全体のデータ量はほぼ変わらないと考えられます。となると、エクステントの大きさは変わらない事になりますので、PCTINCREASEの値はどうでもいいということになります。 このような感じで如何でしょうか?

  • msystem
  • ベストアンサー率42% (79/186)
回答No.1

PCTFREEですが、たとえば、Varchar2の列があるテーブルの場合、最初にInsertするときに、Varchar2の列にNULLを入れ、後でUpdateしたいときがあるとします。そのときに、Oracleでは、できるだけ同じオラクルブロック(Windowsでいうとクラスタ、HDDでいうとセクター)に後でUpdateした内容を入れようとするのですが、オラクルブロック内に空きスペースがないと、別のオラクルブロックに入れてしまいますので、データの断片化が起こることになります。それを避けるために、あらかじめ、Update用にスペースを空けておきます。この空けておくスペースの%表示がPCTFREEです。 PCTUSEは、たとえば、ある行を削除すると、オラクルブロックに空きスペースができます。当然空きがあるので、空きスペースを再利用するのですが、その際利用を開始するオラクルブロックの%表示が、PCTUSEです。 PCTINCREASEは、Oracleでは、いくつかのオラクルブロックをまとめてエクステントという単位で、記憶容量を増やしたり管理したりします。当初、テーブルを設計する際に、データ容量の見積もりをきっちり行い、その容量分だけエクステントをちゃんと作っておけばこのパラメータは不要ですが、見積もりができないときなどは、記憶容量を自動で増やしてもらえるように、設定します。その際に、最初に確保する量(INITIAL句)、その領域が足らなくなったときに増やす量(NEXT句)は、直接数字を指定するのですが、その次に増やす量は、NEXTの数字から増やす量を計算させることができます。これを指定するのがPCTINCREASEです。つまりNEXTで指定した量を増やした領域が足らなくなったとき、NEXTで指定した量×(100+PCTINCREASE)/100を増やします。(増やす量を%表示したことになりますね)その次に増やすのは、前回増やした量×(100+PCTINCREASE)/100で増やす量は、PCTINCREASEずつ増えていくことになります。ただし、PCTINCREASEに0以外を指定すると、記憶領域に断片化につながりますので、注意が必要です。 気をつける点ですが、PCTFREE、PCTUSEは、UPDATEがほとんどないテーブルの場合は、PCTFREEに5ぐらい、PCTUSEにできるだけ大きな数字を使うとほんの少しですが、パフォーマンスが良くなります。Updateが頻繁で、Varchar2が多いテーブルは、PCTFREEを大きめの数字、PCTUSEを少し小さめの数字を使うと断片化を抑えることができます。PCTINCREASEは容量計算をしっかりしてやり、0で使うのが理想です。 ただ、最初は分からないので、デフォルト値でもいいと思います。

lovechuu
質問者

お礼

ありがとうございました。 ぜひ参考にさせていただきます。 回答が遅くなって済みませんでした。

lovechuu
質問者

補足

大変詳しいご回答ありがとうございます。 大変恐縮ですが、もう少し相談に乗ってください。 私が作成するテーブルの使用目的は、 そのテーブルには、前週データ(A)と今週データ(B)があります。 それぞれ、前週・今週をあらわすコードをもっています。 毎週データの更新があり、以下のような処理を行います。 1、前週データ(A)を削除 2、今週データ(B)を前週コード 3、新たに、今週データ(C)を今週データをつけてテーブルにINSERT こういった処理を行う場合、PCTFREE、PCTUSE、PCTFREEは どういった値を与えたらよろしいでしょうか? よろしくお願い致します。

関連するQ&A