查看了一下ALL_TABLES 表,其中有个字段:avg_row_len. 该值单位为bytes。 可以一句这个字段来进行一个估算。
AVG_ROW_LEN*NUMBER
Average length of a row in the table (in bytes)
http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/statviews_2117.htm#i1592091
根据对表大小的估算,进而可以估算出整个数据库的大小。 在项目测试阶段,可以根据所有对象进行估算,从而可以估算出系统上线以后数据库的大小,根据这些数据可以规划存储。这里要注意一点,要给备份留足存储空间。 一般备份需要的空间是DB的2-3倍。
如果DB 是100G,那么给备份的空间最好是200G以上。
根据dba_segments视图可以查看数据库中占用存储空间的对象:
SYS@anqing2(rac2)> select distinctsegment_type from dba_segments;
SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO
11 rows selected.
这里主要就是表和索引。把所有表和索引的大小估算出来,在相加就可以估算出DB的大小了。
二. 估算表的大小
表的大小=记录数*平均字段大小(avg_row_len)
Avg_row_len 可以通过如下SQL 查询。 其单位为bytes。
SYS@anqing2(rac2)> selecttable_name,avg_row_len from all_tables where table_name='T1';
TABLE_NAME AVG_ROW_LEN
------------------------------ -----------
T1 93
如果T1 表未来估计为1000万行,那么其大小就是1000w*93bytes。
三.估算表上索引的大小
All_indexes 视图没有all_tables 上的avg_row_len 字段,不过我们可以通过视图和表大小的一个比率进行估算。 表的大小我们可以估算出来,索引的大小可以通过这个比率进行估算。
SQL>create index idx_t1_created on t1(created)
SQL>exec dbms_stats.gather_table_stats('SYS','T1',cascade=>TRUE)
SYS@anqing2(rac2)> selectsegment_name,segment_type,bytes,blocks from dba_segments where segment_namein ('T1','IDX_T1_CREATED');
SEGMENT_NAME SEGMENT_TYPE BYTES BLOCKS
--------------- ---------------------------- ----------
T1 TABLE 6291456 768
IDX_T1_CREATED INDEX 2097152 256
计算索引和表的比率:
SYS@anqing2(rac2)> select (2097152/6291456)*100,(256/768)*100 from dual;
(2097152/6291456)*100 (256/768)*100
--------------------- -------------
33.3333333 33.3333333
从bytes 和 blocks 的比率是一样,即索引是表的33%。 那么如果估算表以后的大小是1000M,那么对应的索引大小就是1000M*33%=330M。
把所有表和索引的大小加起来,就是整个数据库大小的估算值。
1.创建测试表和索引
SQL> create table t as select * from dba_objects;
Table created.
SQL> create index t_ind on t(object_id);
Index created.
2.收集统计信息
SQL> exec dbms_stats.gather_table_stats(user,'t',cascade=>true);
PL/SQL procedure successfully completed.
3.计算
SQL> select avg_row_len from user_tables where table_name='T';
AVG_ROW_LEN
-----------
98
SQL> select segment_name,segment_type,bytes from user_segments where segment_name in('T','T_IND');
SEGMENT_NAME SEGMENT_TYPE BYTES
--------------------------------------------------------------------------------- ------------------ ----------
T TABLE 9437184
T_IND INDEX 2097152
SQL> select trunc((2097152/9437184)*100) ind_pct from dual;
IND_PCT
----------
22
表大小=row_number*98 *(1+0.22) bytes
整理自《让Oracle跑的更快》谭怀远
转:http://blog.csdn.net/jxzkin/article/details/7659323
分享到:
相关推荐
oracle增加表空间大小oracle增加表空间大小oracle增加表空间大小
调整oracle内存及调整表空间大小方法
ORACLE表空间大小统计语句,比较详细的。。。。
ORACLE临时段表空间不足,修改表空间大小
ORACLE 修改redo日志文件 大小的方法 供大家参考
查询一个Oracle表所占的物理空间大小
帮助您查看oracle的表空间大小,已使用百分比,剩余大小,总大小,表空间名
数据库祥光
ORACLE_表空间扩展方法详细介绍,查看表空间的名字及文件所在位置,对于oracle数据库的表空间,除了用手动增加大小外,还可以增加数据文件等方式扩展表空间大小
主要介绍了oracle普通表转化为分区表的方法,官方给出了四种操作方法,本文主要对第四种方法进行详细分析,需要的朋友可以参考下。
oracle temp表空间不足解决方法
Oracle 表空间建立方法
本文讲述了Oracle修改表空间大小的方法。分享给大家供大家参考,具体如下: 1)查看各表空间分配情况 SQL> select tablespace_name, sum(bytes) / 1024 / 1024 from dba_data_files group by tablespace_name; ...
执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. 这是因为ORACLE只对...
Oracle数据库分区表操作方法Oracle数据库分区表操作方法
oracle锁表查询oracle锁表查询oracle锁表查询oracle锁表查询
通过修改表空间文件大小或者添加表空间文件方式修改Oracle表空间
oracle查询表碎片语句
oracle 系统表大全oracle 系统表大全oracle 系统表大全oracle 系统表大全