我做了个简单的测试, 没有问题: SQL> set timing on SQL>create table t1(id number(4)) nologging; 表已创建 已用时间: 00: 00: 00.16 SQL> declare type numTab is table of number(4) index by binary_integer; data numTab; empty numTab; begin for j in 1 .. 5000 loop data(data.count+1) := j;
if ( mod(data.count,1000) = 0 ) then forall i in 1 .. data.count insert into t1 values ( data(i) ); data := empty; end if;
end loop; if ( data.count is not null ) then forall i in 1 .. data.count insert into t1 values ( data(i) ); end if; commit; end; /
我的问题是:
当我执行下列语句(创建索引后,马上查询)时,查询的字节数竟然是3932160,同时initial_extent,next_extent值也与上面所创建的索引不同,为什么??
我做了个简单的测试, 没有问题:
SQL> set timing on
SQL>create table t1(id number(4)) nologging;
表已创建 已用时间: 00: 00: 00.16 SQL> declare
type numTab is table of number(4) index by binary_integer;
data numTab;
empty numTab;
begin
for j in 1 .. 5000 loop
data(data.count+1) := j;
if ( mod(data.count,1000) = 0 )
then
forall i in 1 .. data.count
insert into t1 values
( data(i) );
data := empty;
end if;
end loop;
if ( data.count is not null )
then
forall i in 1 .. data.count
insert into t1 values
( data(i) );
end if;
commit;
end;
/
PL/SQL 过程已成功完成.
已用时间: 00: 00: 00.88 SQL> select count(*) from t1; COUNT(*)
----------
5000 已用时间: 00: 00: 00.00 SQL> CREATE INDEX ix_t1
2 ON t1
3 (id)
4 PCTFREE 10
5 INITRANS 2
6 MAXTRANS 255
7 TABLESPACE indx
8 STORAGE (
9 INITIAL 2326528
10 NEXT 180224
11 PCTINCREASE 5
12 MINEXTENTS 1
13 MAXEXTENTS 1000000000
14 )
15 /索引已创建。已用时间: 00: 00: 00.78SQL> select bytes,blocks,extents,initial_extent,next_extent from dba_segments
2 where segment_name=upper('ix_t1')
3 / BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
---------- ---------- ---------- -------------- -----------
2359296 288 1 2326528 180224已用时间: 00: 00: 00.87 因此,我的观点如下: 第一: 可能是碎片的问题。 第二: 假如你有一个很大的表,以前有索引,现在想重建这个索引,
就算你指定了相关的存储参数,它也不会按照你的意愿去做。 第三: storage 参数中的 initial 和 next 参数最好保持一致.
第四: 注意pctfree这个参数的合理配置,即保留一定的freelist空间.