通过sql trace比较常规 not in 、minus、not exists效率
(2012-06-15 14:18:14)
标签:
notinminusexists效率it |
分类: 数据库 |
测试目的:
业务中,有两张表,A
表数据900w,B表数据3200w。A表的表结构字段包含B表表结构所有字段,现在要求出A表中不存在B表中的数据。
针对现网,模拟做了如下实验。
1:在无索引的状态下,比较 not in、minus及not
exists查询效率
2:在创建索引的状态下,比较 not in、minus及not
exists查询效率
测试环境:
OS: linux
DB: oracle 10.2.0.4
测试步骤:
首先创建两张表t1 、t2 ,要求将t1
表中不存在t2表中的结果集取出来
SQL> connect hr/hr;
Connected.
SQL> create table t1 as select * from
dba_objects where rownum<=55000;
Table created.
SQL> create table t2 as select * from dba_objects
where rownum<=50000;
Table created.
在没有建立索引的情况下,比较三种的查询效率。
1:not in 方式
SQL> alter session set sql_trace=true;
Session altered.
SQL> select count(*) from t1 where object_id not in
(select object_id from t2);
----------
SQL>
SQL> SELECT
c.value||'/'||d.instance_name||'_ora_'||a.spid||'.trc'
trace_file_name
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/home/oracle/admin/ora10/udump/ora10_ora_9548.trc
SQL>
[oracle@test1 ~]$ tkprof
/home/oracle/admin/ora10/udump/ora10_ora_9548.trc
/home/oracle/1.txt
[oracle@test1 ~]$ more 1.txt
********************************************************************************
select count(*)
from
t1 where object_id not in (select object_id from t2)
call
------- ------
Parse
Execute
Fetch
------- ------
total
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 55
Rows
-------
********************************************************************************
2:测试 minus
SQL> select count(*) from (select object_id from t1
minus select object_id from t2);
----------