数据库表结构己确定,数据最大的行数也已估算出.如何根据表结构确定每一行数据应占用多大空间?以进一步确定系统将来占用空间大小.
比如有一表 person 有如下字段信息:
name varchar 20
age number 3
address varchar 200
desc Blob
根据这样一个表结构,如何确定每行要占用多大磁盘空间?有没有一个评估公式?或能否提供相关资料?
...全文
11905打赏收藏
如何评估数据库容量.
数据库表结构己确定,数据最大的行数也已估算出.如何根据表结构确定每一行数据应占用多大空间?以进一步确定系统将来占用空间大小. 比如有一表 person 有如下字段信息: name varchar 20 age number 3 address varchar 200 desc Blob 根据这样一个表结构,如何确定每行要占用多大磁盘空间?有没有一个评估公式?或能否提供相关资料?
四。于是,该索引所需要的数据块数量为:
number of blocks
for index = 1.1 * ((number of not null rows * avg. entry size) /
((floor (avail. data space / avg. entry size)) *
(avg. entry size))
注:这里带入了系数1.1主要考虑到INDEX的建立需要分支(BRANCH ENTRY BLOCKS)
number of blocks
for index = 1.1 * ((10000 * 32 bytes) / ((floor (1700/32 bytes)) *
(32 bytes))
= 208 blocks
二。块中可用的空间为:
available data space = (block size - total block header) -
((block size - total block header) * (PCTFREE/100))
假定BLOCK SIZE=2K,PCTFREE=10,即:
available data space = (2048 - (84 + 2x)) - ((2048 - (84 + 2x)) * (10/100))
= (1964 - 2x) - ((2048 - 84 - 2x) * (10/100))
= (1964 - 2x) - (1964 - 2x) * 0.1
= (1964 - 2x - 196 + 0.2x) bytes
= (1768 - 1.8x) bytes
三。计算每条记录的长度:
这取决于三个方面,
1。表中定义的列的个数
2。每列的类型
3。变长列的平均长度(根据与实际数据库类似的测试数据库)
SELECT AVG(NVL(VSIZE(col1), 1)) +
AVG(NVL(VSIZE(col2), 1)) +
... +
AVG(NVL(VSIZE(coln), 1)) "SPACE OF AVERAGE ROW"
FROM table_name;
注:记录结尾的列如果不空,上述公式有效;如果结尾的列为空,该列长被计为0。
举例来讲,我们创建了TEST表,
CREATE TABLE test ( A CHAR(10), B DATE, C NUMBER(10, 2));
我们可以通过
SELECT AVG(NVL(VSIZE(A), 1)) +
AVG(NVL(VSIZE(B), 1)) +
AVG(NVL(VSIZE(C), 1)) "SPACE OF AVERAGE ROW"
FROM test;
来估算每条记录的大小。
如果测试数据库不存在,则需要分别考虑各列的情况。
1。对于定长列,每条记录的该列值也是定长;
2。对于变长列,首先要估计该列的平均值,然后再决定该值需要多大空间。
就TEST表来讲,A列与B列均为定长列,所以他们分别需要10及7 BYTES来存储。对于C列,
假设平均该值有8位长度,由于是数字类型,所以存储长度为:
average length column C = (average_precision/2 + 1) bytes
= (8/2 + 1) bytes
= 5 bytes
这样, average row (for columns)= (A + B + C)
= (10 + 7 + 5) bytes
= 22 bytes
四。记录平均存储空间为:
average row size = row header + F + V + D
其中:
row header = 3 bytes (非CLUSTER表)
F = 列长的总和(1 byte表示长度的列,CHAR, NUMBER, DATE, and ROWID types)
V = 列长的总和(3 bytes表示长度的列,CHAR, LONG, RAW, LONG RAW datatypes)
D = average row (for columns,from above)
说明:
1。由于每列数据在存储时需要额外的位来表示其长度,通常,如果该列值>250,需要3 bytes表示,
如果<250,需要1 byte表示,
2。对于NON-CLUSTERED表,average row size最小值为9,所以如果上述值小于9,则要用9 bytes计算。
再看TEST表,
average row size = row header + F + V + D
= 3+(1*3)+(3*0)+22
= 28 bytes
五。平均每块中的记录数为,
average number of rows per block = floor(available data space / average row size)
x = floor((1768-1.8x)/28)
28x =1768-1.8x
x = 59 (近似值)
根据记录量的大小,例如TEST表中有10000条记录,可以算得该表需要的数据块数量:
number of blocks
for the table = number of rows / average number of rows per block
= 10000/59
= 169 blocks (近似值)
从而得到该表可能占据的存储空间为169*db_block_size.