oracle数据库空间估算
生活随笔
收集整理的這篇文章主要介紹了
oracle数据库空间估算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
oracle數據庫空間估算
如何計算存儲空間,整理了一下
我們在設計一個數據庫的時候除了考慮數據塊的大小,可能還要和開發溝通,這個數據庫要存儲多少數據,那么這個數據庫應該具備多大的容量來滿足一個應用的存儲吶?DBA就需要計算一下這個應用占用多大的存儲空間
首先我們來看一下幾個換算的單位:
1K=1024Bytes;
1M=1024K
1G=1024M
1T=1024G
而我們的表里一個字段能占用多大的空間吶?我們先看一下字段的類型:
1.? ? ? ? 變成:number(),varchar2 (),long ,blob等都是變成 (單位都是Bytes)
2.? ? ? ? 定長:date (7bytes) ,char()
根據經驗:
1.對于變長字段的處理:
我們在估算一行所占用空間的時候只能是取最大值,比如x number(20),這個字段,我們不管插入x列里的內容是否真正的滿足20個bytes,我們都按照20來計算;
2.對于定長字段的處理:
??這個就直接取實際長度就ok了;
具個例子來計算一下平均行占用的存儲空間:
Create table test (x number(20),y varchar2(20),z date ,char(20));
那么這個表平均每行最大使用的空間為:
(20+20+7+20)=67 (Bytes)
??假設這個表里有20000000條數據,那么這個表所使用的凈空間(pur_stroage)為:
(20+20+7+20)*20000000 (Bytes)=1278M
但是ORACLE在組織存儲的時候是有空間結構的,oracle要把一部分空間分配給數據庫作為結構存儲(str_storage),不會把所有的空間都分配給我們用來數據存儲,這么大的數據量我們要給多少真正的存儲空間(real_stroage)?
我們可以用下邊這個簡單的公式來計算:
? ?real_stroage= str_storage+ pur_stroage
上邊這個公式中,我們已知了pur_stroage 要求出real_stroage就需要知道str_storage,ok現在我們來了解一下每個塊的存儲形式下圖是個block的結構圖
_______________________________________________________________________
|? ?? ?? ?? ?? ?? ?? ?|? ? ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|??1fixed? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|? ?header? ?? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|___________|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|? ?? ?? ?? ?? ?? ?? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
| 2. variable? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
| trans_header |? ?? ?? ?? ? 5- available_block? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|___________ |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|? ?? ?? ?? ?? ?? ?? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|??3.table dir? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|___________|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|??4.row dir? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|___________|___________________________________________________________|
? ??
1-4部分組成了一個數據塊的塊頭(block_header)
5 是數據塊的塊身(block_body)
一個一個說吧:
1.? ? ? ? 定長的數據塊頭 57bytes
2.? ? ? ? 塊中事務并發使用空間,這個值是有可能變化的,如果多個事務并發,那么這個塊的大小會發生改變,一個事務是23*1 bytes,2個事務是23*2 bytes,依次類推,一般我們計算的似乎后按照23*1來計算
3.? ? ? ? 使用塊的表 4 bytes
4.? ? ? ? 使用塊的行 2 *n bytes 這個塊的列使用情況在于有多少行如果有4行數據存儲在這個塊里那么n=4
5.? ? ? ? 才是表和索引能使用的存儲空間
那么是不是5里的空間我們能夠完全使用吶?
非也,拿上邊的例子來說吧,假設有一行數據里test.x里存儲的數值是1,這個時候有一個語句來執行:
??Update test set x=100000000,而恰好這個時候此行數據所在的block滿了怎么辦?
Oracle為了避免這種情況的發生,引入了兩個概念:
??PCTUSED和PCTFREE,這兩個值相當于2個水位線,我們拿一個杯子來比喻數據塊,那么PCTUSED控制這個杯子什么時候可以繼續倒水;而PCTUSED表示什么時候這個杯子不能再倒水了
? ?假設PCTUSED設置成了6,PCTFREE設置成了2 ,那么它就表示,當一個杯子達到了60%空的時候可以再繼續使用,當杯子的水達到80%的時候就不能再倒水了,而這個值全部都記錄在數據塊的freelist列表里;
? ? 所以可見,5里的初次使用率最高也不會超過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=該表里的數據量
? ? 當然這個值所求出來的也是個近似的值;
如何計算存儲空間,整理了一下
我們在設計一個數據庫的時候除了考慮數據塊的大小,可能還要和開發溝通,這個數據庫要存儲多少數據,那么這個數據庫應該具備多大的容量來滿足一個應用的存儲吶?DBA就需要計算一下這個應用占用多大的存儲空間
首先我們來看一下幾個換算的單位:
1K=1024Bytes;
1M=1024K
1G=1024M
1T=1024G
而我們的表里一個字段能占用多大的空間吶?我們先看一下字段的類型:
1.? ? ? ? 變成:number(),varchar2 (),long ,blob等都是變成 (單位都是Bytes)
2.? ? ? ? 定長:date (7bytes) ,char()
根據經驗:
1.對于變長字段的處理:
我們在估算一行所占用空間的時候只能是取最大值,比如x number(20),這個字段,我們不管插入x列里的內容是否真正的滿足20個bytes,我們都按照20來計算;
2.對于定長字段的處理:
??這個就直接取實際長度就ok了;
具個例子來計算一下平均行占用的存儲空間:
Create table test (x number(20),y varchar2(20),z date ,char(20));
那么這個表平均每行最大使用的空間為:
(20+20+7+20)=67 (Bytes)
??假設這個表里有20000000條數據,那么這個表所使用的凈空間(pur_stroage)為:
(20+20+7+20)*20000000 (Bytes)=1278M
但是ORACLE在組織存儲的時候是有空間結構的,oracle要把一部分空間分配給數據庫作為結構存儲(str_storage),不會把所有的空間都分配給我們用來數據存儲,這么大的數據量我們要給多少真正的存儲空間(real_stroage)?
我們可以用下邊這個簡單的公式來計算:
? ?real_stroage= str_storage+ pur_stroage
上邊這個公式中,我們已知了pur_stroage 要求出real_stroage就需要知道str_storage,ok現在我們來了解一下每個塊的存儲形式下圖是個block的結構圖
_______________________________________________________________________
|? ?? ?? ?? ?? ?? ?? ?|? ? ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|??1fixed? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|? ?header? ?? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|___________|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|? ?? ?? ?? ?? ?? ?? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
| 2. variable? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
| trans_header |? ?? ?? ?? ? 5- available_block? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|___________ |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|? ?? ?? ?? ?? ?? ?? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|??3.table dir? ???|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
|? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???|
|___________|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|??4.row dir? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|? ?? ?? ?? ?? ?? ?? ? |? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?|
|___________|___________________________________________________________|
? ??
1-4部分組成了一個數據塊的塊頭(block_header)
5 是數據塊的塊身(block_body)
一個一個說吧:
1.? ? ? ? 定長的數據塊頭 57bytes
2.? ? ? ? 塊中事務并發使用空間,這個值是有可能變化的,如果多個事務并發,那么這個塊的大小會發生改變,一個事務是23*1 bytes,2個事務是23*2 bytes,依次類推,一般我們計算的似乎后按照23*1來計算
3.? ? ? ? 使用塊的表 4 bytes
4.? ? ? ? 使用塊的行 2 *n bytes 這個塊的列使用情況在于有多少行如果有4行數據存儲在這個塊里那么n=4
5.? ? ? ? 才是表和索引能使用的存儲空間
那么是不是5里的空間我們能夠完全使用吶?
非也,拿上邊的例子來說吧,假設有一行數據里test.x里存儲的數值是1,這個時候有一個語句來執行:
??Update test set x=100000000,而恰好這個時候此行數據所在的block滿了怎么辦?
Oracle為了避免這種情況的發生,引入了兩個概念:
??PCTUSED和PCTFREE,這兩個值相當于2個水位線,我們拿一個杯子來比喻數據塊,那么PCTUSED控制這個杯子什么時候可以繼續倒水;而PCTUSED表示什么時候這個杯子不能再倒水了
? ?假設PCTUSED設置成了6,PCTFREE設置成了2 ,那么它就表示,當一個杯子達到了60%空的時候可以再繼續使用,當杯子的水達到80%的時候就不能再倒水了,而這個值全部都記錄在數據塊的freelist列表里;
? ? 所以可見,5里的初次使用率最高也不會超過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=該表里的數據量
? ? 當然這個值所求出來的也是個近似的值;
總結
以上是生活随笔為你收集整理的oracle数据库空间估算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle Recyclebin
- 下一篇: 数据库空间估算