1、估算表容量
1)创建测试表和表空间
SQL> create table t as select * from dba_objects;Table createdSQL> 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 count(*) from t;COUNT(*)----------50805SQL> select a.segment_name,a.segment_type,a.BYTES from user_segments a where a.segment_name in ('T','T_IND');SEGMENT_NAME SEGMENT_TYPE BYTES------------- ------------------ ----------T TABLE 6291456T_IND INDEX 983040--让我们来顺便计算一下该表中的索引和表大小的百分比SQL> select trunc((983040/6291456)*100) as "ind_pct(%)" from dual;ind_pct(%)----------15
现在我们可以估算这张表数据的大小了。
比如说我们最终估计这个表保存的数据大概在10亿条,我们就可以算出这张表所需空间大小。
SQL> select ((6291456+983040)/50805*1000000000)/1024/1024/1024 as "T表所需空间大小(G)" from dual;T表所需空间大小(G)------------------133.351094257455
2、正式环境
SQL> select index_name,index_type,table_name from user_indexes where table_name ='PRODUCT';INDEX_NAME INDEX_TYPE TABLE_NAME------------------------------ --------------------------- ------------------------------PRODUCT_ID NORMAL PRODUCTSYS_IL0000054761C00013$ LOB PRODUCTVISICOUNT2 NORMAL PRODUCTPRODUCT_STATUS NORMAL PRODUCTSID_INDEX2 NORMAL PRODUCTPRODUCT_NAME2 NORMAL PRODUCTCREATE_TIME2 NORMAL PRODUCTCREATE_SID2 NORMAL PRODUCTSYS_IL0000054761C00118$ LOB PRODUCT9 rows selected
3)查看该表和索引空间的大小
select a.segment_name, a.segment_type, a.BYTESfrom user_segments awhere a.segment_name in(select INDEX_NAME from user_indexes where table_name = 'PRODUCT')or a.segment_name = 'PRODUCT';SEGMENT_NAME SEGMENT_TYPE BYTES-------------------------------------------------------------------------------- ------------------ ----------PRODUCT TABLE 5242880SYS_IL0000054761C00013$ LOBINDEX 65536PRODUCT_ID INDEX 196608CREATE_SID2 INDEX 458752CREATE_TIME2 INDEX 327680PRODUCT_NAME2 INDEX 524288SID_INDEX2 INDEX 196608PRODUCT_STATUS INDEX 196608VISICOUNT2 INDEX 131072SYS_IL0000054761C00118$ LOBINDEX 6553610 rows selected
4)统计大小
select sum(a.BYTES)from user_segments awhere a.segment_name in(select INDEX_NAME from user_indexes where table_name = 'PRODUCT')or a.segment_name = 'PRODUCT';SUM(A.BYTES)------------7405568
5)查询表的总大小
SQL> select count(*) from product;COUNT(*)----------2572
假如有100w条数据算出大小
SQL> select ((7405568/2572)*1000000)/1024/1024/1024 as "PRODUCT表所需空间(G)" from dual;PRODUCT表所需空间(G)--------------------2.68156013073484