1、准备大表large_table
create table large_table as
select * from SYS.SOURCE$;
insert into large_table
select * from SYS.SOURCE$;
analyze table large_table compute statistics;
select num_rows, table_name
From user_tables
where table_name = 'LARGE_TABLE';
本例中LARGE_TABLE表共有1195684 行
2、7种方法效率测试
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> set timing on
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.03
==========================排名第1: 00: 00: 00.00==========================
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.01
SQL> declare
2 i int;
3 begin
4 select count(*) into i from LARGE_TABLE where rownum=1;--判断是否有数据5(隐式游标)
5 if sql%found then
6 dbms_output.put_line('LARGE_TABLE exists data.');
7 else
8 dbms_output.put_line('LARGE_TABLE no data.');
9 end if;
10 end;
11 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
==========================排名第2: 00: 00: 00.03==========================
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.01
SQL> declare
2 i int;
3 begin
4 select count(1) into i from LARGE_TABLE where rownum=1;--判断是否有数据3
5 if i<>0 then
6 dbms_output.put_line('LARGE_TABLE exists data.');
7 else
8 dbms_output.put_line('LARGE_TABLE no data.');
9 end if;
10 end;
11 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.03
==========================排名第3: 00: 00: 00.04==========================
SQL> alter system flush buffer_cache;
SQL> begin
2 for i in (select 1 from LARGE_TABLE where rownum=1) loop--判断是否有数据7(隐式游标)
3 dbms_output.put_line('LARGE_TABLE exists data.');
4 end loop;
5 end;
6 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.04
SQL> /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.01
==========================排名第3: 00: 00: 00.04==========================
SQL> declare
2 cursor c1 is select 1 from LARGE_TABLE where rownum=1;
3 i int;
4 begin
5 open c1;
6 fetch c1 into i;
7 if c1%found then--判断是否有数据6(显式游标)
8 dbms_output.put_line('LARGE_TABLE exists data.');
9 else
10 dbms_output.put_line('LARGE_TABLE no data.');
11 end if;
12 close c1;
13 end;
14 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.04
SQL> /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
==========================排名第3: 00: 00: 00.04==========================
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.01
SQL> declare
2 i int;
3 begin
4 select count(1) into i from LARGE_TABLE where rownum=1;--判断是否有数据4(隐式游标)
5 if sql%found then
6 dbms_output.put_line('LARGE_TABLE exists data.');
7 else
8 dbms_output.put_line('LARGE_TABLE no data.');
9 end if;
10 end;
11 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.04
SQL> /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
==========================排名第4: 00: 00:05.47==========================
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.01
SQL> declare
2 i int;
3 begin
4 select count(1) into i from LARGE_TABLE;--判断是否有数据2
5 if i<>0 then
6 dbms_output.put_line('LARGE_TABLE exists data.');
7 else
8 dbms_output.put_line('LARGE_TABLE no data.');
9 end if;
10 end;
11 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 05.47
==========================排名第5: 00: 00: 09.57==========================
SQL> alter system flush buffer_cache;
系统已更改。
已用时间: 00: 00: 00.01
SQL> declare
2 i int;
3 begin
4 select count(*) into i from LARGE_TABLE;--判断是否有数据1
5 if i<>0 then
6 dbms_output.put_line('LARGE_TABLE exists data.');
7 else
8 dbms_output.put_line('LARGE_TABLE no data.');
9 end if;
10 end;
11 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 09.57