可以參照博文: 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適合外表結果集比較小的情況。