如何計(jì)算存儲(chǔ)空間,整理了一下
我們?cè)谠O(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)的時(shí)候除了考慮數(shù)據(jù)塊的大小,可能還要和開(kāi)發(fā)溝通,這個(gè)數(shù)據(jù)庫(kù)要存儲(chǔ)多少數(shù)據(jù),那么這個(gè)數(shù)據(jù)庫(kù)應(yīng)該具備多大的容量來(lái)滿足一個(gè)應(yīng)用的存儲(chǔ)吶?DBA就需要計(jì)算一下這個(gè)應(yīng)用占用多大的存儲(chǔ)空間
首先我們來(lái)看一下幾個(gè)換算的單位:
1K=1024Bytes;
1M=1024K
1G=1024M
1T=1024G
而我們的表里一個(gè)字段能占用多大的空間吶?我們先看一下字段的類型:
1. 變成:number(),varchar2 (),long ,blob等都是變成 (單位都是Bytes)
2. 定長(zhǎng):date (7bytes) ,char()
根據(jù)經(jīng)驗(yàn):
1.對(duì)于變長(zhǎng)字段的處理:
我們?cè)诠浪阋恍兴加每臻g的時(shí)候只能是取最大值,比如x number(20),這個(gè)字段,我們不管插入x列里的內(nèi)容是否真正的滿足20個(gè)bytes,我們都按照20來(lái)計(jì)算;
2.對(duì)于定長(zhǎng)字段的處理:
這個(gè)就直接取實(shí)際長(zhǎng)度就ok了;
具個(gè)例子來(lái)計(jì)算一下平均行占用的存儲(chǔ)空間:
Create table test (x number(20),y varchar2(20),z date ,char(20));
那么這個(gè)表平均每行最大使用的空間為:
(20+20+7+20)=67 (Bytes)
假設(shè)這個(gè)表里有20000000條數(shù)據(jù),那么這個(gè)表所使用的凈空間(pur_stroage)為:
(20+20+7+20)*20000000 (Bytes)=1278M
但是ORACLE在組織存儲(chǔ)的時(shí)候是有空間結(jié)構(gòu)的,oracle要把一部分空間分配給數(shù)據(jù)庫(kù)作為結(jié)構(gòu)存儲(chǔ)(str_storage),不會(huì)把所有的空間都分配給我們用來(lái)數(shù)據(jù)存儲(chǔ),這么大的數(shù)據(jù)量我們要給多少真正的存儲(chǔ)空間(real_stroage)?
我們可以用下邊這個(gè)簡(jiǎn)單的公式來(lái)計(jì)算:
real_stroage= str_storage+ pur_stroage
上邊這個(gè)公式中,我們已知了pur_stroage 要求出real_stroage就需要知道str_storage,ok現(xiàn)在我們來(lái)了解一下每個(gè)塊的存儲(chǔ)形式下圖是個(gè)block的結(jié)構(gòu)圖
_______________________________________________________________________
| | |
| 1fixed | |
| header | |
|___________| |
| | |
| 2. variable | |
| trans_header | 5- available_block |
|___________ | |
| | |
| 3.table dir | |
| | |
|___________| |
| | |
| 4.row dir | |
| | |
|___________|___________________________________________________________|
1-4部分組成了一個(gè)數(shù)據(jù)塊的塊頭(block_header)
5 是數(shù)據(jù)塊的塊身(block_body)
一個(gè)一個(gè)說(shuō)吧:
1. 定長(zhǎng)的數(shù)據(jù)塊頭 57bytes
2. 塊中事務(wù)并發(fā)使用空間,這個(gè)值是有可能變化的,如果多個(gè)事務(wù)并發(fā),那么這個(gè)塊的大小會(huì)發(fā)生改變,一個(gè)事務(wù)是23*1 bytes,2個(gè)事務(wù)是23*2 bytes,依次類推,一般我們計(jì)算的似乎后按照23*1來(lái)計(jì)算
3. 使用塊的表 4 bytes
4. 使用塊的行 2 *n bytes 這個(gè)塊的列使用情況在于有多少行如果有4行數(shù)據(jù)存儲(chǔ)在這個(gè)塊里那么n=4
5. 才是表和索引能使用的存儲(chǔ)空間
那么是不是5里的空間我們能夠完全使用吶?
非也,拿上邊的例子來(lái)說(shuō)吧,假設(shè)有一行數(shù)據(jù)里test.x里存儲(chǔ)的數(shù)值是1,這個(gè)時(shí)候有一個(gè)語(yǔ)句來(lái)執(zhí)行:
Update test set x=100000000,而恰好這個(gè)時(shí)候此行數(shù)據(jù)所在的block滿了怎么辦?
Oracle為了避免這種情況的發(fā)生,引入了兩個(gè)概念:
PCTUSED和PCTFREE,這兩個(gè)值相當(dāng)于2個(gè)水位線,我們拿一個(gè)杯子來(lái)比喻數(shù)據(jù)塊,那么PCTUSED控制這個(gè)杯子什么時(shí)候可以繼續(xù)倒水;而PCTUSED表示什么時(shí)候這個(gè)杯子不能再倒水了
假設(shè)PCTUSED設(shè)置成了6,PCTFREE設(shè)置成了2 ,那么它就表示,當(dāng)一個(gè)杯子達(dá)到了60%空的時(shí)候可以再繼續(xù)使用,當(dāng)杯子的水達(dá)到80%的時(shí)候就不能再倒水了,而這個(gè)值全部都記錄在數(shù)據(jù)塊的freelist列表里;
所以可見(jiàn),5里的初次使用率最高也不會(huì)超過(guò)available_block*PCTFREE
str_storage=(fix_header+trans_header+table_dir+row_dir*N)*pctfree/10
real_stroage= str_storage+ pur_stroage
=(fix_header+trans_header+table_dir+row_dir*N)*pctfree/10+(20+20+7+20)* N
N=該表里的數(shù)據(jù)量
當(dāng)然這個(gè)值所求出來(lái)的也是個(gè)近似的值;
我們?cè)谠O(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)的時(shí)候除了考慮數(shù)據(jù)塊的大小,可能還要和開(kāi)發(fā)溝通,這個(gè)數(shù)據(jù)庫(kù)要存儲(chǔ)多少數(shù)據(jù),那么這個(gè)數(shù)據(jù)庫(kù)應(yīng)該具備多大的容量來(lái)滿足一個(gè)應(yīng)用的存儲(chǔ)吶?DBA就需要計(jì)算一下這個(gè)應(yīng)用占用多大的存儲(chǔ)空間
首先我們來(lái)看一下幾個(gè)換算的單位:
1K=1024Bytes;
1M=1024K
1G=1024M
1T=1024G
而我們的表里一個(gè)字段能占用多大的空間吶?我們先看一下字段的類型:
1. 變成:number(),varchar2 (),long ,blob等都是變成 (單位都是Bytes)
2. 定長(zhǎng):date (7bytes) ,char()
根據(jù)經(jīng)驗(yàn):
1.對(duì)于變長(zhǎng)字段的處理:
我們?cè)诠浪阋恍兴加每臻g的時(shí)候只能是取最大值,比如x number(20),這個(gè)字段,我們不管插入x列里的內(nèi)容是否真正的滿足20個(gè)bytes,我們都按照20來(lái)計(jì)算;
2.對(duì)于定長(zhǎng)字段的處理:
這個(gè)就直接取實(shí)際長(zhǎng)度就ok了;
具個(gè)例子來(lái)計(jì)算一下平均行占用的存儲(chǔ)空間:
Create table test (x number(20),y varchar2(20),z date ,char(20));
那么這個(gè)表平均每行最大使用的空間為:
(20+20+7+20)=67 (Bytes)
假設(shè)這個(gè)表里有20000000條數(shù)據(jù),那么這個(gè)表所使用的凈空間(pur_stroage)為:
(20+20+7+20)*20000000 (Bytes)=1278M
但是ORACLE在組織存儲(chǔ)的時(shí)候是有空間結(jié)構(gòu)的,oracle要把一部分空間分配給數(shù)據(jù)庫(kù)作為結(jié)構(gòu)存儲(chǔ)(str_storage),不會(huì)把所有的空間都分配給我們用來(lái)數(shù)據(jù)存儲(chǔ),這么大的數(shù)據(jù)量我們要給多少真正的存儲(chǔ)空間(real_stroage)?
我們可以用下邊這個(gè)簡(jiǎn)單的公式來(lái)計(jì)算:
real_stroage= str_storage+ pur_stroage
上邊這個(gè)公式中,我們已知了pur_stroage 要求出real_stroage就需要知道str_storage,ok現(xiàn)在我們來(lái)了解一下每個(gè)塊的存儲(chǔ)形式下圖是個(gè)block的結(jié)構(gòu)圖
_______________________________________________________________________
| | |
| 1fixed | |
| header | |
|___________| |
| | |
| 2. variable | |
| trans_header | 5- available_block |
|___________ | |
| | |
| 3.table dir | |
| | |
|___________| |
| | |
| 4.row dir | |
| | |
|___________|___________________________________________________________|
1-4部分組成了一個(gè)數(shù)據(jù)塊的塊頭(block_header)
5 是數(shù)據(jù)塊的塊身(block_body)
一個(gè)一個(gè)說(shuō)吧:
1. 定長(zhǎng)的數(shù)據(jù)塊頭 57bytes
2. 塊中事務(wù)并發(fā)使用空間,這個(gè)值是有可能變化的,如果多個(gè)事務(wù)并發(fā),那么這個(gè)塊的大小會(huì)發(fā)生改變,一個(gè)事務(wù)是23*1 bytes,2個(gè)事務(wù)是23*2 bytes,依次類推,一般我們計(jì)算的似乎后按照23*1來(lái)計(jì)算
3. 使用塊的表 4 bytes
4. 使用塊的行 2 *n bytes 這個(gè)塊的列使用情況在于有多少行如果有4行數(shù)據(jù)存儲(chǔ)在這個(gè)塊里那么n=4
5. 才是表和索引能使用的存儲(chǔ)空間
那么是不是5里的空間我們能夠完全使用吶?
非也,拿上邊的例子來(lái)說(shuō)吧,假設(shè)有一行數(shù)據(jù)里test.x里存儲(chǔ)的數(shù)值是1,這個(gè)時(shí)候有一個(gè)語(yǔ)句來(lái)執(zhí)行:
Update test set x=100000000,而恰好這個(gè)時(shí)候此行數(shù)據(jù)所在的block滿了怎么辦?
Oracle為了避免這種情況的發(fā)生,引入了兩個(gè)概念:
PCTUSED和PCTFREE,這兩個(gè)值相當(dāng)于2個(gè)水位線,我們拿一個(gè)杯子來(lái)比喻數(shù)據(jù)塊,那么PCTUSED控制這個(gè)杯子什么時(shí)候可以繼續(xù)倒水;而PCTUSED表示什么時(shí)候這個(gè)杯子不能再倒水了
假設(shè)PCTUSED設(shè)置成了6,PCTFREE設(shè)置成了2 ,那么它就表示,當(dāng)一個(gè)杯子達(dá)到了60%空的時(shí)候可以再繼續(xù)使用,當(dāng)杯子的水達(dá)到80%的時(shí)候就不能再倒水了,而這個(gè)值全部都記錄在數(shù)據(jù)塊的freelist列表里;
所以可見(jiàn),5里的初次使用率最高也不會(huì)超過(guò)available_block*PCTFREE
str_storage=(fix_header+trans_header+table_dir+row_dir*N)*pctfree/10
real_stroage= str_storage+ pur_stroage
=(fix_header+trans_header+table_dir+row_dir*N)*pctfree/10+(20+20+7+20)* N
N=該表里的數(shù)據(jù)量
當(dāng)然這個(gè)值所求出來(lái)的也是個(gè)近似的值;