sqlplus之 big_table

根据all_objects创建一个空表,这个字典视图用于填充big_table

create table big_table as
select rownum id, a.*
from all_objects a
where 1=0
/

置这个表为NOLOGGING,为了提高性能。对于测试表使用NOLOGGING模式是安全的。

由于生产系统不会使用这样一个测试表,所以不会启用诸如oracle data guard之类的特性

alter table big_table nologging;

用all_objects的内容填充表,然后迭代的插入其自身中,每次迭代会使表大小几乎加倍。

declare
l_cnt number;
l_rows number := &1;
begin
insert /*+ APPEND */ into big_table
select rownum id, a.*
from all_objects a;
l_cnt := sql%rowcount;
commit;
while (l_cnt < l_rows)
loop
insert /*+ APPEND */ into big_table
select rownum+l_cnt  id,
 OWNER,
 OBJECT_NAME,
 SUBOBJECT_NAME,
 OBJECT_ID,
 DATA_OBJECT_ID,
 OBJECT_TYPE,
 CREATED,
 LAST_DDL_TIME,
 TIMESTAMP,
 STATUS,
 TEMPORARY,
 GENERATED,
 SECONDARY,
 NAMESPACE,
 EDITION_NAME
from big_table
where rownum <= l_rows-l_cnt;
l_cnt := l_cnt + sql%rowcount;
commit;
end loop;
end;
/

对这个表创建一个主键约束。

alter table big_table add constraint
big_table_pk primary key(id)
/

收集统计结果

begin
dbms_stats.gather_table_stats
( ownname => 'scott',
tabname => 'BIG_TABLE',
method_opt => 'for all indexed columns',
cascade => TRUE );
end;
/
显示表中的行数
select count(*) from big_table;

结果:

scott@ORCL>@D:\app\Administrator\product\11.2.0\big_table.sql;

表已创建。


表已更改。

输入 1 的值:  100000
原值    3: l_rows number := &1;
新值    3: l_rows number := 100000;

PL/SQL 过程已成功完成。


表已更改。


PL/SQL 过程已成功完成。


  COUNT(*)
----------
    100000

猜你喜欢

转载自blog.csdn.net/a0001aa/article/details/79593389