pl/sql里的exists和in的差别
生活随笔
收集整理的這篇文章主要介紹了
pl/sql里的exists和in的差别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目中有個需要需要如下pl/sql(數據庫是MariaDB)
SELECT COUNT(1) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21'AND EXISTS(SELECT 1 FROM cmp_ent_service_config WHERE entId=a.id AND serviceType IN(2,3,4) AND STATUS=0) ;執行時發現耗時近50秒,這是測試環境啊,
表cmp_ent_main,pk是id,有74836條記錄;表cmp_ent_service_config,pk是entId和serviceType,有2254條記錄,并不多。
explain看一下執行計劃:
說實話,mysql不熟,也并沒看出什么門道。
經過排查原因,最后發現原因是cmp_ent_service_config表的entId是varchar, entId是企業Id,這個系統里約定的企業Id是bigint。看來做這個模塊的設計者忽略了這一點就設置成varchar了。
改成bigint,果然,毫秒級就查出結果了。類型一致多么的重要!
?
我找到這個模塊的開發擔當,他習慣用in,于是改成in,并恢復entId的類型為varchar,發現也是毫秒級出結果。
EXPLAINSELECT COUNT(1) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21'AND EXISTS(SELECT 1 FROM cmp_ent_service_config WHERE entId=a.id AND serviceType IN(2,3,4) AND STATUS=0) ;EXPLAINSELECT 0 allcount, COUNT(1) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21'AND a.id IN(SELECT entId FROM cmp_ent_service_config WHERE serviceType IN(2,3,4) AND STATUS=0)細看兩者的查詢計劃,發現主要的區別是cmp_ent_main的記錄數,一個是70303,一個是1
當把entId的類型改為bigint后, 兩者的執行計劃是:
?
?
轉載于:https://www.cnblogs.com/buguge/p/5854325.html
總結
以上是生活随笔為你收集整理的pl/sql里的exists和in的差别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3_STL算法
- 下一篇: php每天一题:strlen()与mb_