可以参照博文: http://www.nowamagic.net/librarys/veda/detail/1502
1、选择最有效的表明顺序(仅适用于RBO模式)
****不同的数据库的解析器对from后的跟的表名处理顺序有所不同----记录数量最小的放在最右端****
2、select 查询中避免使用“*”
3、尽量减少访问数据库次数。
4、删除重复记录
5、多使用Exists,少使用IN
1
SELECT PUB_NAME FROM PUBLISHERS
2
WHERE PUB_ID IN
3
(SELECT PUB_ID FROM TITLES WHERE TYPE = ‘BUSINESS‘)
可以用下面语句代替:
1
SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS
2
(SELECT 1 FROM TITLES WHERE TYPE = ‘BUSINESS‘ AND
3
PUB_ID= PUBLISHERS.PUB_ID)
in和exists的区别与执行效率问题
例子:
select * from T1 where T1.id in (select T2.id from T2);
select * from T1 where exists(select 1 from T2 where T2.id = T1.id);
忠告:
若T2中的数据量明显少用in比用exists合适
若T2中的数据量明显多用exists比用in合适
总结:IN把外表和内表做hash join ,而exists对外表做loop(循环遍历),每次loop再对内标进行查询。这样一来,in适合内外表都很大的情况,exists适合外表结果集比较小的情况。
本文出自 “丑小鸭的天空” 博客,谢绝转载!