oracle数据库数据量如何计算,oracle数据库空间估算

本文介绍了如何计算Oracle数据库中表所占用的存储空间,包括数据块、固定头部、变量头部、表目录和行目录等部分,并讨论了PCTUSED和PCTFREE在空间管理中的作用,提供了一个估算数据库存储需求的简单公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何计算存储空间,整理了一下

我们在设计一个数据库的时候除了考虑数据块的大小,可能还要和开发沟通,这个数据库要存储多少数据,那么这个数据库应该具备多大的容量来满足一个应用的存储呐?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=该表里的数据量

当然这个值所求出来的也是个近似的值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值