当前位置:数据库 > Oracle >>

Oracle创建索引前估算索引大小(dbms_space.create_index_cost)

Oracle创建索引前估算索引大小(dbms_space.create_index_cost)
 
在一个表的某个字段创建索引前估算其大小,最好的办法就是在测试库创建索引做预测。
如果没有测试环境还可以使用dbms_space.create_index_cost来估算其大小。
语法:  www.zzzyk.com  
DBMS_SPACE.CREATE_INDEX_COST (
   ddl             IN    VARCHAR2,
   used_bytes      OUT   NUMBER,
   alloc_bytes     OUT   NUMBER,
   plan_table      IN    VARCHAR2 DEFAULT NULL);
示例:
[sql]
SQL> create table xyc_test (id int,name varchar(32));  
  
表已创建。    www.zzzyk.com  
  
SQL> begin  
  2  for i in 1..100000 loop  
  3  insert into xyc_test values(i,'向银春');  
  4  end loop;  
  5  commit;  
  6  end;  
  7  /  
  
PL/SQL 过程已成功完成。  
  
SQL> exec dbms_stats.gather_table_stats(user,'XYC_TEST');  
  
PL/SQL 过程已成功完成。  
  
SQL> variable used_bytes number;  
SQL> variable alloc_bytes number;  
SQL> exec DBMS_SPACE.CREATE_INDEX_COST('create index x_idx on xyc_test(id)',:used_bytes,:alloc_bytes);  
  
PL/SQL 过程已成功完成。  
  
SQL> print :used_bytes  
    500000  
----估算分配大小  
SQL> print :alloc_bytes  
    3145728  
  
SQL> create index x_idx on xyc_test(id);  
  
索引已创建。  
----实际分配大小,这里感觉和估算的相差较大,可能和数据量有关  
SQL> select bytes from user_segments where segment_name='X_IDX';  
   2097152  
或使用下面的方法更方便
[sql]
SQL> declare  
  2  v_ddl varchar(1024);  
  3  v_used_bytes number;  
  4  v_alloc_bytes number;  
  5  begin  
  6  dbms_space.create_index_cost(  
  7  ddl =>' create index x_idx on xyc_test(id) ',used_bytes=>v_used_bytes,alloc_bytes =>v_alloc_bytes);  
  8  dbms_output.put_line('used_bytes='||v_used_bytes||' bytes'||' alloc_bytes='|| v_alloc_bytes || ' bytes');  
  9  end;  
 10  /  
used_bytes=500000 bytes alloc_bytes=3145728 bytes  
  
PL/SQL 过程已成功完成。  
 
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,