系統要求進行sql優化,對效率比較低的sql進行優化,使其執行效率更高,其中要求對sql中的部分in/not in修改為exists/not exists
修改方法如下:
in的sql語句
select id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
from tab_oa_pub where is_check=1 and
category_id in (select id from tab_oa_pub_cate where no='1')
order by begintime desc
修改為exists的sql語句
select id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
from tab_oa_pub where is_check=1 and
exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1')
order by begintime desc
分析一下exists真的就比in的效率高嗎?
在oracle sql中取資料時有時要用到in 和 exists 那麼他們有什麼區別呢?
1 效能上的比較
比如select * from t1 where x in ( select y from t2 )
執行的過程相當於:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
相對的select * from t1 where exists ( select null from t2 where y = x )
執行的過程相當於:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
output the record
end if
end loop
表 t1 不可避免的要被完全掃瞄一遍
分別適用在什麼情況?
以子查詢 ( select y from t2 )為考慮方向
如果子查詢的結果集很大需要消耗很多時間,但是t1比較小執行( select null from t2 where y = x.x )非常快,那麼exists就比較適合用在這裡
相對應得子查詢的結果集比較小的時候就應該使用in.
以上來自
sql語句in和exists的效率
select a.from a where exists select 1 from b where a.id b.id 和select a.from a where a.id in select b.id from b 的效率比較 1.如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應...
sql中in和exists的區別
in是把外表和內錶作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大 如果兩個表中乙個較小乙個較大,則子查詢表大的用exists,子查詢錶小的用in ...
SQL中in和exists的區別
in和exists in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。in parm1,parm2.parm是有個數限制的 如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in 例如 表a 小表 表b 大表 1...