两个语句谁高效的理解

[复制链接]
查看11 | 回复9 | 2006-9-6 01:01:55 | 显示全部楼层 |阅读模式
select * from a (where a.XX in select * from b where b.xx=XX);
select * from a, b where a.XX = b.XX and b.XX = xx
这2种sql,那种效率比较高?
有人问我这个问题,
我的理解是
都有可能,一样高或者是一个高一低,一低一高。
第一种有IN子句,所以一定走全表扫描
一样效率情况
但是在CBO下,有可能第二个索引失效走全表,那都全表,效率肯定一样高了。
一高一低就是看IO了,如果不是在CBO下,全表扫描效率不一定会
更高,是看IO,所以就有两种可能

不知道我给人解释的对不对,有没有误人子弟,如果有错,请指粗出,我明天给人纠正一下。
谢谢!
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
不能笼统的说这两句SQL,哪个好哪个不好?
判断好坏,我们只能看执行计划。这两句SQL可能产生同样的执行计划,那就是一样好(坏),没有任何区别。
不过从语法上来说,两句的语义是不同的,因为使用in的话,不会出现重复的行,而join会产生重复的行。
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
记得tom说过,这样的例子他能设计很多场景来证明有时候第一个高效,有时候第二个高效,所以实际情况要实际分析
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
LZ是否先把第一条SQL改正确, 我还真看不出来怎么写的。
第一条未必就是全表扫描。 IN一定是全表扫描的么?这个我倒没听过。
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
最初由 feibiao1 发布
[B]LZ是否先把第一条SQL改正确, 我还真看不出来怎么写的。
第一条未必就是全表扫描。 IN一定是全表扫描的么?这个我倒没听过。 [/B]

IN的时候,索引会失效的
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
其实IN未必就是全表扫描,事实上x in (1,2)相当于x=1 or x=2,例如:
SQL> create table t
2(id int,
3name varchar2(20),
4constraint pk_t primary key (id)
5using index tablespace users);
表已创建。
SQL> insert into t
2values(1,'dfdsfsd');
已创建 1 行。
SQL> insert into t
2values(2,'dsfdsfsd');
已创建 1 行。
SQL> insert into t
2values(3,'fdsfds');
已创建 1 行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('scott','t',cascade=>true);
PL/SQL 过程已成功完成。
SQL> select * from t
2
SQL> set autotrace traceonly explain;
SQL> select * from t
2where id in (1,3);
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=2 Bytes=22)
10 INLIST ITERATOR
21 TABLE ACCESS (BY INDEX ROWID) OF 'T' (TABLE) (Cost=2 Car

d=2 Bytes=22)
32 INDEX (RANGE SCAN) OF 'PK_T' (INDEX (UNIQUE)) (Cost=1

Card=2)


SQL>
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
最初由 wdjk1999 发布
[B]
IN的时候,索引会失效的 [/B]

没听说过
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
只有在IN 后面的条件是被明确写出的时候?
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
最初由 zhang41082 发布
[B]记得tom说过,这样的例子他能设计很多场景来证明有时候第一个高效,有时候第二个高效,所以实际情况要实际分析 [/B]

具体还要看实际应用!
回复

使用道具 举报

千问 | 2006-9-6 01:01:55 | 显示全部楼层
把你的sql补全,然后自己做个执行计划吧。sql效率和应用有很大关系
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行