LMT下表儲存引數的使用

space6212發表於2019-07-21

這裡主要討論在LMT和DMT下某些儲存引數的設定的異同。



假設當前資料庫的DB_BLOCK_SIZE為D(K),建表的DDL設定了INITIAL為T,MINEXTENTS為S,PCTINCREASE為P,NEXT為N
本文的DB_BLOCK_SIZE=8K
1、字典管理
MIN_EXTENT:可以是大於0的任意整數
PCT_INCREASE:
INITIAL:,則如果建表時設定的INITIAL設定的值大於2*D,則實際INITIAL=CEIL(T/D)*D;如果建表時設定的INITIAL設定的值小於等於2*D,則實際INITIAL值為2*D。
如:EXP-1
create table test1
(
a number
)
tablespace system--字典管理表空間
storage
(
initial 1k
next 1k
minextents 4
pctincrease 20
);

在這個例子中,實際INITIAL為16K;

EXP-2
create table test2
(
a number
)
tablespace system--字典管理表空間
storage
(
initial 100k
next 100k
minextents 4
pctincrease 20
);
在這個例子中,實際的INITIAL=CEIL(100/8)*8=104

NEXT:
如果S=1,則實際的NEXT=CEIL(INITIAL*(1+P/100)/N)*N,其中INITIAL為實際值,而不是設定值;
如果S>1,則NEXT的實際值為S=1的情況下的第S+1個extent的值
EXP-3
create table test1
(
a number
)
tablespace system--字典管理表空間
storage
(
initial 100k
next 100k
minextents 1
pctincrease 20
);

在本例中,實際的NEXT=CEIL(104*1.2/8)*8=128
EXP-4
create table test1
(
a number
)
tablespace system--字典管理表空間
storage
(
initial 100k
next 100k
minextents 4
pctincrease 20
);

在本例中,實際的NEXT=192。
第二個EXTENT=INITIAL=104

SQL> select ceil(104*1.2/8)*8 from dual;(第3個EXTENT)

CEIL(124.8/8)*8
---------------
128


SQL> select ceil(128*1.2/8)*8 from dual;(第4個EXTENT)

CEIL(128*1.2/8)*8
-----------------
160

SQL> c/128/160
1* select ceil(160*1.2/8)*8 from dual;(第5個EXTENT)
SQL> /

CEIL(160*1.2/8)*8
-----------------
192

在本例中,NEXT=192K

2、本地管理


在建立表空間和建立表時,都可以設定storage引數。其中表的storage引數的優先順序大於表空間的引數。如果建表時沒有指定storage,則oracle會繼承表所對應的表空間的儲存引數。

INITIAL
LMT下,oracle在表空間一級不能設定NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS,但在段一級可以設定這幾個引數(如在建表、索引的時候)。如果在段一級設定了這幾個引數,則這幾個引數將用來計算段的INITIAL值,此時段的INITIAL值將不是設定值,而是透過計算得到。
如果LMT表空間不是UNIFORM,則:
EXP-5
create table test
(
a number
)
storage
(
initial 100k
next 100k
minextents 4
pctincrease 100
);

該表所在表空間為本地管理的,這個表的實際的INITIAL為832K。
在LMT下,extent都是以64K為基本單位的,其初始的extent一般為64K。在本例中,MINEXTENTS為4,則前四個extent的實際大小分別為:
104K-104K-208K-416K(PCTINCREASE 100,參考DICT下INITIAL的計算方法)
所以,本例中INITIAL=104+104+208+416=832K。由於LMT下的EXTENT最小單位是64K,832剛好是64的倍數,所以oracle分配13個extents給INITIAL;如果計算得到的INITIAL不是64K的整數倍,oracle會按一下方法計算並分配:
CEIL(INITIAL/64)*64

如果LMT是UNIFORM(UNIT SIZE=16K),則
EXP-6
create table test
(
a number
)
tablespace t_uniform
storage
(
initial 100k
next 100k
minextents 4
);

則INITIAL=104+104+104+104=416,建表時oracle分配了26個extent給test

LMT下,PCTINCREASE, NEXT引數將不復存在(不能修改)[

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63744/,如需轉載,請註明出處,否則將追究法律責任。

相關文章