テーブル設計

テーブル設計は、論理設計におけるエンティティをテーブルとし、テーブルの非正規化は物理設計段階では積極的には行わず、パフォーマンス上問題となる可能性がある部分の洗い出しのみを行い、ランニングテストの結果を基にチューニング段階で行います。



5.2.1.容量概算手順
ユーザテーブルの容量概算は以下の手順に従って算出し、余裕率10%を上乗せした値をinitialエクステントサイズとしinitialエクステントサイズの10%をnextエクステントサイズとします。

 

0.調査対象テーブル構成 

SQL>DESC LOCATION

名前 NULL? タイプ

------------------------------- -------- ----

LOC_ID  NUMBER(10)

LOCATION_NAME CHAR(30)

PROVINCE_ID VARCHAR2(2)

LOC_TYPE VARCHAR2(2)



1.動的パフォーマンス表V$TYPE_SIZEより固定値を調査する。

$ svrmgrl

SVRMGR>connect internal

SVRMGR>select type, description, type_size

      2> from v$type_size

3> where type in ('UB1','UB4','SB2','KCBH','KTBIT','KTBBH', 'KDBH','KDBT'); 

TYPE DESCRIPTION TYPE_SIZE

-------- -------------------------------- ----------

UB1 UNSIGNED BYTE 1 1

UB4 UNSIGNED BYTE 4  4

SB2 SIGNED BYTE 2 2

KCBH BLOCK COMMON HEADER 20

KTBIT TRANSACTION VARIABLE HEADER 24

KTBBH TRANSACTION FIXED HEADER 48

KDBH DATA HEADER 14

KDBT TABLE DIRECTORY ENTRY 4


 

2.動的パフォーマンス表V$PARAMETERよりDB_BLOCK_SIZEを調査します。

SVRMGR> select value from v$parameter where name = 'db_block_size'; 

VALUE

------------------------------------------------------------

2048



--- ここからは机上で実施 ---

3.データに使える領域(SAD)= データブロックサイズ - ブロックヘッダ を計算します。

db_block_size - (KCBH + UB4 + KTBBH + (initrans-1) * KTBIT + KDBH)

2048 - (20 + 4 + 48 + (1-1) * 24 + 14)

= 1962 Bytes                          initrans=1 (デフォルト)



4.使用可能なデータ領域(ADS)を計算します。 ここで仮定としてPCTFREE 20とします。 

ceil (SAD * (1-pctfree/100))-KDBT

ceil (1962 * (1-20/100)) - 4

ceil (1962 * 0.8) - 4

=1959 Bytes                           ceil():切上げ



5.1行あたりの使用領域(SPR)を計算します。カラムサイズ250バイトを基点に加算値が変わります。

Colum size including type length =

Colum size + (1, if colum size < 250 , else 3)


LOC_ID 6 + 1 = 7

LOCATION_NAME 30 + 1 = 31

PROVINCE_ID 2 + 1 = 3

LOC_TYPE 2 + 1 = 3


TOTAL = 44 Bytes (TCS)



6.行サイズ(ROWSZ)を計算します。

ROWSZ=行ヘッダー + TCS

(3 * UB1)  + TCS  =  47 Bytes



7.1行あたりの使用領域(SPROW)を計算します。

max (UB1 * 3 + UB4 + SB2, ROWSZ) + SB2

max (1 * 3 + 4 + 2, 47) + 2 = 49

max (9,47) + 2 = 49 Bytes


8.ブロックあたりの平均行数(RPB)を計算します。

floor (ADS / SPROW) = floor (1959 / 49) = 39 row per data block        floor():切捨て



9.対象となる表の行数が390,000行と仮定して、LOCATION表について適切な記憶領域パラメータを計算します。

ceil (390,000 rows / 39 row per data block) = 10,000 blocks

10,000 * 2048 = 20,480,000 Bytes


INITIAL

25,765,888 * 1.1 = 22,528,000 = 22MB (切上げ)

NEXT

22 * 0.1 = 2MB


 


5.2.2.PCTFREE・PCTUSEDの算出
テーブルを作成する際に、PCTFREEおよびPCTUSEDを決定する必要があります。しかし、すべてのテーブルに対して最適な値を定義するのは困難でありますが、一般的な値、もしくは必要に応じて統計情報を取得して決定します。


一般的な値


参照が中心のメタ情報テーブルには、PCTFREE5%・PCTUSED70%、更新が頻繁に行われる時系列テーブルはPCTFREE20%・PCTUSED70%とし、numberやvarchar2といった可変長項目が多いテーブルについてはPCTFREE30%・PCTUSED80%とします。



統計情報の取得

PCTFREE

1.テーブルの統計情報を取得します。

SQL>analyze table SAMPLE compute statistics;



2.ビューUSER_TABLESより統計結果を取得し、1ブロック当りの行数を取得します。

SQL>select num_rows, blocks, num_rows/blocks from user_tables 

2>where table_name = ‘SAMPLE’;


3.頻度の高いと思われるUPDATEを実行し、再度2の手順を実行する。

SQL>update SAMPLE set sampno = 100 

2>where sampname = ‘PCTCHECK’;


ここで1ブロック当りの行数をチェックしてください。差がない場合はPCTFREEの値が適しています。しかし、変化がない場合もPCTFREEが余分に取られている可能性があるため、3-1の手順より平均値を求め、値が大きい場合はPCTFREEを小さくする検討をします。


3-1.ビューUSER_TABLESより統計結果を取得し、1ブロック当りの行数の平均を取得します。

SQL>select num_rows, blocks, num_rows/blocks, avg_space from user_tables 

2>where table_name = ‘SAMPLE’;



PCTUSED

PCTUSEDは特に算出方法がなく、APでの処理形態で考えるべきです。例えば、PCTFREEが40%で削除処理が頻繁に発生するAPでは、表内のブロックは40%しか使用されません。

 


5.2.3.自動作成されるインデックスの設定

Oracle7より、表の主キー制約やユニーク制約を設定すると、Oracleによって暗黙的にインデックスが作成されます。このとき作成されるインデックスのSTORAGE句は、ユーザ表領域のDEFAULT STORAGEが採用されてしまいます。これを避けるため、次の手順を行います。


CREATE TABLEで、PRIMARY KEY・UNIQUE KEY制約を定義しない。

ALTER TABLEの CONSTRAINT句で、USING INDEX句を指定する。



テーブルTESTの作成例を示します。

SQL>create table TEST 

  2>(col number(10), char(30)) 

3> tablespace USR_DATA 

4> default storage(initial 1M, next 100K pctincrease 0); 


SQL>alter table TEST 

  2>add constraint PK_TEST primary key(col ) 

3>using index 

4>pctfree 20 

5>tablespace IDX_DATA 

6>storage(initial 400K next 40K pctincrease 0); 



 


5.2.4.設定指針

テーブル作成における指針を示します。


・更新系 minextents =1 , maxextents =249 , pctfree = 20 , pctused = 70とします。

・参照系 minextents =1 , maxextents =249 , pctfree = 5 , pctused = 70とします。

・可変長 minextents =1 , maxextents =249 , pctfree = 30 , pctused = 80とします。

・INITIAL * 1.05, NEXT(INITIAL * 1.05) * 0.1



 

SQL>create table LOCATION ( 

2>LOC_ID  NUMBER(10) 

3>LOCATION_NAME CHAR(30) 

4>PROVINCE_ID VARCHAR2(2) 

5>LOC_TYPE VARCHAR2(2)) 

6>pctfree 30 

7>pctused 80 

8>tablespace USERS 

9>storage (initial 22M next 2M pctincrease 0); 

SQL>


詳細については、「Oracle8Server 管理者ガイド」の付録A「スキーマ・オブジェクトの領域の見積もり」を参照してください。

最終更新:2008年11月15日 22:16