如下2个sql:
sql1:
select * from table1 t1
inner join table2 on t1.id = t2.oid
where t2.name like '%XXX%'
sql2:
select * from table1 t1
inner join table2 on t1.id = t2.oid and t2.name like '%XXX%'
以上2个sql哪个性能有差别吗?
sql1:
select * from table1 t1
inner join table2 on t1.id = t2.oid
where t2.name like '%XXX%'
sql2:
select * from table1 t1
inner join table2 on t1.id = t2.oid and t2.name like '%XXX%'
以上2个sql哪个性能有差别吗?
不过'%aaaa%'不会走索引,应注意一下
create table t2(oid number,name varchar2(10));
insert into t1 select rownum from dual connect by level<=100000;
insert into t2 select rownum,rownum||'a' from dual connect by level<=1000000;
commit;sys@ORCL> set autot trace exp
sys@ORCL> ed
Wrote file afiedt.buf 1 select * from t1
2 inner join t2 on t1.id = t2.oid
3* where t2.name like '%XXX%'sys@ORCL> /Execution Plan
----------------------------------------------------------
Plan hash value: 2959412835---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 64 | 2112 | 1647 (3)| 00:00:20 |
|* 1 | HASH JOIN | | 64 | 2112 | 1647 (3)| 00:00:20 |
|* 2 | TABLE ACCESS FULL| T2 | 64 | 1280 | 1600 (2)| 00:00:20 |
| 3 | TABLE ACCESS FULL| T1 | 103K| 1314K| 45 (5)| 00:00:01 |
---------------------------------------------------------------------------
sys@ORCL> ed
Wrote file afiedt.buf 1 select * from t1
2* inner join t2 on t1.id = t2.oid and t2.name like '%XXX%'
sys@ORCL> /Execution Plan
----------------------------------------------------------
Plan hash value: 2959412835---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 64 | 2112 | 1647 (3)| 00:00:20 |
|* 1 | HASH JOIN | | 64 | 2112 | 1647 (3)| 00:00:20 |
|* 2 | TABLE ACCESS FULL| T2 | 64 | 1280 | 1600 (2)| 00:00:20 |
| 3 | TABLE ACCESS FULL| T1 | 103K| 1314K| 45 (5)| 00:00:01 |
---------------------------------------------------------------------------
可以看到、你的两个sql的执行计划完全一致、本质上讲这是两个完全相同的sql
二 性能上是都不走索引的,因为在数据前都有通配符%
确实、两个都是 Plan hash value: 2959412835
谢谢提醒、
2)有个原则是"让每个结果集最小"、SQL引擎的组件查询转换器会进行查询转换、先过滤、再联合;这在大多数场合都是合理有效的