はじめまして。おしえてください

初めてOracleでテーブルを作成します。

そのときにPCTFREE、PCTUSE、PCTINCREASEの設定
をするのですが、これはなんですか?
これを設定する際に気をつけたらいいことをおしえてください。

お願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

前回の回答にも、書きましたが、PCTFREE、PCTUSEは、テーブルのデータに対し、Updateを使うかどうかによります。

補足の文面をそのまま取りますと、Updateはほとんど影響ないことになりますので(今週のデータを先週のデータに変更する作業が、NULLが入っている列にフラグ用に何かデータを入れるという作業でない場合)、そのような場合、PCTFREEはできるだけ小さく、PCTUSEはできるだけ大きくとるのが、パフォーマンス的には良いことになりますので、PCTFREEには5ぐらい、PCTUSEは90くらいをお勧めします。(Oracleの仕様で、PCTFREE+PCTUSE<100という決まりがありますので気をつけてください)

あと、先週のデータを削除し、今週のデータを先週のデータに変更し、新たに今週のデータを追加するという作業の流れを見ると、全体のデータ量はほぼ変わらないと考えられます。となると、エクステントの大きさは変わらない事になりますので、PCTINCREASEの値はどうでもいいということになります。

このような感じで如何でしょうか?
    • good
    • 0

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で使うのが理想です。
ただ、最初は分からないので、デフォルト値でもいいと思います。

この回答への補足

大変詳しいご回答ありがとうございます。

大変恐縮ですが、もう少し相談に乗ってください。
私が作成するテーブルの使用目的は、
そのテーブルには、前週データ(A)と今週データ(B)があります。
それぞれ、前週・今週をあらわすコードをもっています。
毎週データの更新があり、以下のような処理を行います。
1、前週データ(A)を削除
2、今週データ(B)を前週コード
3、新たに、今週データ(C)を今週データをつけてテーブルにINSERT

こういった処理を行う場合、PCTFREE、PCTUSE、PCTFREEは
どういった値を与えたらよろしいでしょうか?

よろしくお願い致します。

補足日時:2001/12/04 21:56
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/18 21:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q運用中のALTER TABLE

運用中でアクセスがあるテーブルに
ALTER TABLEで項目を追加したいのですが
問題ありますでしょうか?
オラクル9iです。

宜しくお願い致します。

Aベストアンサー

(1)ALTER TABLE文は表ロックがかかります(自身なし(^^;)。
SELECT ~ FOR UPDATE NOWAITで実行するSQL文等があるとリソースビジー
(ORA-00054)が戻る場合があります。

(2)テーブルを変更することによっていろいろ(プロシージャなどが)
無効(INVALID)になる場合がありますので、オブジェクトの状態を確認
したほうが良いと思います。

(3) DEFAULT指定がALTER TABLE文にある場合、undo領域が圧迫
(領域不足)したり、ALTER TABLEがなかなか完了しなかったりします。
(私はコレでハマリました(^^;)

今のところ、思いつくのはコレだけですが、いずれにしろテストできる
環境で確認されたほうが良いと思います。

QAccessから主キーの無いOracleテーブルにVBAで主キー設定付のODBC接続するには

Oracle7--------------- Access97
Workgroup Server
Release 7.3.2.2.1

TABLE_A----------------ODBC接続(リンクテーブル)    
項目1
項目2
項目3
項目4

項目1~項目4は
空白レコードがあり
主KEYが張れない

********************************************************************
主キーの作成出来ないオラクルテーブルがあります。

Access97からODBC接続を作成する時は

(1)マニュアルであれば
  対象テーブルに主キーが無ければ
任意の10項目を仮の主キーとして設定出来ますが

(2)VBA(自動?)で リンク張ると

Dim tab01 As TableDef
 Dim db01 As Database
 Dim strTABname As String

strTABname = TABLE名
Set db01 = CurrentDb
Set tab01 = db01.CreateTableDef(UserName & "_" & strTABname, dbAttachSavePWD)
tab01.SourceTableName = UserName & "." & strTABname
tab01.CONNECT = "ODBC;DSN=****;UID=" & UserName & ";PWD=" & Password & ";ConnectString=con;"
db01.TableDefs.Append tab01

主キー設定の無いODBC接続が出来て
  データの更新などが出来なくなります。

VBAでも仮の主キー設定付きのODBC接続は
 出来ないでしょうか?

Oracle7--------------- Access97
Workgroup Server
Release 7.3.2.2.1

TABLE_A----------------ODBC接続(リンクテーブル)    
項目1
項目2
項目3
項目4

項目1~項目4は
空白レコードがあり
主KEYが張れない

********************************************************************
主キーの作成出来ないオラクルテーブルがあります。

Access97からODBC接続を作成する時は

(1)マニュアルであれば
  対象テーブルに主キーが無ければ
任...続きを読む

Aベストアンサー

手元にACC97は無いのですが、擬似インデックスを作成すれば可能だったはず。

作成方法は通常のINDEX作成と変わりはありません。

db01.Execute "CREATE INDEX ・・・・;"

QOracleのCreate Table 文のStorage句

お世話になります。

OracleのCreate Table 文のStorage句のNextの値を
変更したいのですが、できるのでしょうか?

Alter Table文で変更するのでしょうか?
手元にマニュアルが無く困っております。

よろしくお願いします。

Aベストアンサー

alter table テーブル名 storage ( next 変更後のサイズ );

だっけかな?

Qテーブル作成クエリで主キーを設定

サブフォーム作成のため主キーを設定したいのですが、クエリでグループ化した顧客コードをテーブルとするクエリで主キーを顧客コードに設定したいのですが、クエリ実行で主キー設定方法を教えてください。

Aベストアンサー

テーブル作成クエリ実行後、
DAO で CreateIndex ということになると思います。

おそらく、ワークテーブルで編集し、
元のテーブルに書き戻すような処理をお考えだと思いますが、
あらかじめ、主キーを設定したテーブルを作成しておき、
削除クエリで、全レコード削除、
テーブル作成クエリを追加クエリに変更したもので、
新しいレコードを追加する、
という処理で置き換えられませんか?

Access であるとして、
テーブルの作成、削除を繰り返すと、
MDB ファイルの破損につながりますので。

見当違いだったら無視してください。

Qmysqlのalter table中のロックについてです。

mysqlのalter table中のロックについてです。


下記のように、alterでテーブルを再構築中に同じテーブルにinsertが実行された場合、
接続Bのinsertはブロックされるかと思うのですが、テーブルが大きくalterに時間がかかる場合、
タイムアウトなどは発生するのでしょうか。
またもし発生する場合、タイムアウト値の設定などの確認方法はあるのでしょうか。

1.接続A
 alter table table1 add columnB int(11) ;

2.接続B(接続Aのalter実行中)
 insert into table1(columnA) values('aaa');

Aベストアンサー

ロック待ち関連のパラメータは、
innodb_lock_wait_timeout
table_lock_wait_timeout
だと思うんですが、DDLでロックされているテーブルのロック待ちに関しては、上記パラメータが関係ないようでした。
私の設定値は、デフォルトの50(両方とも)

※確認方法
show variables like '%timeout%';


2パターン、やってみました。

セッション1
alter table table1 add primary key(c1); /* 20分間 */

セッション2
start transaction;
insert into a values (100000001); /* セッション1終了後、ロック解除 */
rollback;

セッション1
alter table table1 drop primary key; /* 10分経過 */

セッション2
lock tables table1 write; /* おそらく、セッション1終了後ロック解除するのでしょう */

QOracleのテーブルサイズ

Oracle(8.0.5以降)で、テーブル毎のサイズを知りたいのですが、どこにその情報はあるのでしょうか?
テーブルが拡張されてそれぞれどの程度のサイズになっているのか、また、何%程度使用しているのか等が知りたいのです。
以前に、Oracleのシステムテーブルにそのような情報をもっていると聞いたことがあるのですが、わかりません。
どなたかわかる方がいましたら、よろしくお願い致します。

Aベストアンサー

簡単に調べる方法があります。
以下のSQL文をSQL*Plus等で実行してみてください。

select segment_name,trunc(bytes/1024,0) kb
from user_segment
where segment_name='*****'
/

*****に目的のテーブル名を設定します。
テーブルのサイズがKバイト単位で表示されます。
バイト単位で知りたい場合は、trunc(bytes/1024,0)をbytesに
置き換えます。

Qalter table で text が midiumtext になってしまう

当初作ったテーブル(テーブル名=test)では
col1 char(10) unique not null,
col2 text not null,
col3 text not null,
col4 text not null
だったのですが、col1だけをchar→varcharに変えたくて
alter table test modify col1 varchar(10) unique not null
としたところ、他のtext型項目が全てmidiumtextになってしまいました。

ひとつずつtextに直そうと
alter table test modify col2 text not null
を実行し次に
alter table test modify col3 text not null
とするとcol3はtextになるがcol2がまたmidiumtextになってしまいます。

midiumtextほどの容量は必要ないのでcol2~col4をtextに戻したいのですが、
どのようにすればよいのでしょうか。
ご教示願います。

宜しくお願い致します。

当初作ったテーブル(テーブル名=test)では
col1 char(10) unique not null,
col2 text not null,
col3 text not null,
col4 text not null
だったのですが、col1だけをchar→varcharに変えたくて
alter table test modify col1 varchar(10) unique not null
としたところ、他のtext型項目が全てmidiumtextになってしまいました。

ひとつずつtextに直そうと
alter table test modify col2 text not null
を実行し次に
alter table test modify col3 text not null
とするとcol3はtextになるがcol2...続きを読む

Aベストアンサー

UNIQUEは引き継がれるはずなので、changeをつかって
以下のようにしてみてはいかがでしょうか?

ALTER TABLE `test`
CHANGE `col1` `col1` VARCHAR(10) NOT NULL
,CHANGE `col2` `col2` TEXT NOT NULL
,CHANGE `col3` `col3` TEXT NOT NULL
,CHANGE `col4` `col4` TEXT NOT NULL

ただしMySQLのバージョンにもよるでしょうけど、
暗黙のフィールド定義変更がはたらいて手動による
型変更は意味がないかもしれません

参考URL:http://www.mysql.gr.jp/Manual/mysql-4.00.12/manual.ja_Reference.html#Silent_column_changes

QORACLEのテーブルスペースについて

OS:AIX Ver.4.3
DB:ORACLE(Ver.8.1.6)
でSQL*Loaderを実行していたのですが、
"エラーコード -2 STDERR 書込不可"?

(ログを消してしまってはっきりは覚えてないのですが)
というエラーログが出力され、その後、ロードする
テーブルのTABLESPACEについて
"ORA-01536: 表領域 TABLESPACEXXXに対して割り当てられた領域を使い果たしました。"
というORACLEのエラーが発生し始めました。

その後、CREATEは上記ORACLEエラーにより実行不可、
その後のINSERTは途中までできていたのですが、途中から
同様のORALCEエラーにより実行不可、
という状態になっています。
(直前まで通常にデータの更新は行えていました)

ちなみに該当するTABLESPACEに割り付けられたデータ
ファイルにはまだ十分領域が空いています。
該当するTABLESPACEのデータファイルに対する割付領域を
"ALTER TABLE ~" で拡大できたと思うのですが、
方法がはっきり分かりません。

どなたかご存知の方、また、このエラー自体の原因が
分かる方、いらっしゃったらお願いします。

OS:AIX Ver.4.3
DB:ORACLE(Ver.8.1.6)
でSQL*Loaderを実行していたのですが、
"エラーコード -2 STDERR 書込不可"?

(ログを消してしまってはっきりは覚えてないのですが)
というエラーログが出力され、その後、ロードする
テーブルのTABLESPACEについて
"ORA-01536: 表領域 TABLESPACEXXXに対して割り当てられた領域を使い果たしました。"
というORACLEのエラーが発生し始めました。

その後、CREATEは上記ORACLEエラーにより実行不可、
その後のINSERTは途中までできていたのですが、途中か...続きを読む

Aベストアンサー

Tablespaceで連続した空き領域を確保できなくて、"ORA-01536: ~"の
エラーが発生した可能性はあります。

しかし修復する方法が今思いつきませんので、てっとり早い対策として
"ALTER TABLESPACE"で表領域を拡張する方法を紹介します。

Windows系OSの例ですが、
"ALTER TABLESPACE 表領域名
ADD DATAFILE 'ファイル名'
SIZE 拡張サイズM
/"
と、SQL*Plus等で入力してください。
ファイル名は、パス付きで入力します。
拡張サイズの後ろには、M(メガ)かK(キロ)を付けること。


(サンプル) 表領域 "USERS"を100M拡張します

ALTER TABLESPACE "USERS"
ADD DATAFILE 'D:\ORACLE\ORADATA\USERS100.DBF'
SIZE 100M
/

QALTER TABLE mytable CHANGE

mytableというテーブルのaカラムの型と名前を変更するのは
ALTER TABLE mytable CHANGE a new_a INT;
でできましたが、今度はnew_aをbにすると動時にTINYINT(4)にしたいのですが、SQLの文法が違うようだったので正しいものを教えてください。
ALTER TABLE mytable CHANGE new_a b TINYINT(4);
でなく、何なのですか?

Aベストアンサー

それで合っています。
(少なくともウチの4.0.23ではそれで変更できてます)

本当に文法ミスでのエラーでしょうか?
エラーの内容を確認してみてください。

QOracle テーブルの列削除

タイトルの通りテーブル(test)の列(retu)を削除したいのですが・・・

Sql*pLUS画面
SQL> alter table test drop(retu); ←この用に入力
alter table test drop(retu)
*
エラー行: 1: エラーが発生しました。
ORA-00905: キーワードがありません。

となってしまい列を削除できません。
なにか構文の間違いでしょうか?

Aベストアンサー

alter table 表名
drop column 列名;

はOracleのバージョン8.1.5からです。
それ以前の場合は表を再作成します、

まず、既存の表名を変更して、
create table as select します。その際に削除したい列は抜かします。

1.rename 既存の表名 to 新しい表名;

2.create table 既存の表名
as select 必要な列のみ記述 from 新しい表名;


ただ、注意点としては「再作成」ですので、制約はNOT NULL以外全てなくなります。


人気Q&Aランキング

おすすめ情報