sqlin效率低
⑴ sql 語句中in ,not in
如果系統不自動優化,並且IN的結果很多,那麼有可能IN和NOT IN的效率低些。
所有的IN都可以轉換為EXISTS,同樣NOT IN可以轉換為NOT EXISTS,下面說明IN轉換為EXISTS的方法,NOT的類似:
IN的語句:
SELECT * FROM A WHERE F IN (SELECT F FROM B)
可以轉換為如下的EXISTS語句:
SELECT * FROM A WHERE EXISTS
(SELECT * FROM B WHERE A.F=B.F)
上面轉換的說明:兩個WHETE都可能有更多都條件,那麼直接AND在相應的地方即可。另外表A和B的關聯欄位可能名字表同,也司沒關系的。
⑵ sql in 執行效率低 如何優化
你這樣不好,in,exists都是子查詢
你應該考慮連接查詢,這樣速度快很多。
以樓上兄弟為例子:
SELECT sum(*)
FROM pas_guiyyw
WHERE exists (SELECT 1
FROM subTable
WHERE subTable.rule='ruleContext'
AND pas_guiyyw.id= subTable.id )
應該修改為:
SELECT sum(*)
FROM pas_guiyyw a,
subTable b WHERE
a.id= b.id
and b.rule='ruleContext'
這樣效率高很多。
⑶ SQL優化——IN和EXISTS誰的效率更高
在SQL編程中,IN和EXISTS是常被使用的子查詢方式,它們的功能相似但效率存在差異。通過對比不同場景下的測試,可以發現使用哪一種更為高效。
在測試1中,我們使用了子查詢`select flag from B where B_id<100`,結果集為99條。在這個場景下,IN的效率高於EXISTS。IN執行計劃中,首先執行A表的查詢,並利用索引優化,然後執行B表子查詢,同樣使用索引。而EXISTS的執行計劃則先取A表所有記錄,然後逐行關聯B表子查詢,使用Block Nested Loop優化。
測試2中,子查詢`select flag from B where B_id>100`,結果集為299899條。這次EXISTS的效率比IN高。兩者在索引使用上與第一次測試一致,但當子查詢結果集較大而外部表較小時,EXISTS的Block Nested Loop開始發揮優勢,查詢效率優於IN。
綜上所述,並不能斷言IN或EXISTS的效率更高,具體情況需要具體分析。IN的執行原理是先查詢內表得到結果集,再與外表匹配,不管子查詢是否有數據,都會進行全部匹配,這在內表數據量較大時效率較低。而EXISTS則是先對外表進行循環查詢,只在匹配到數據時返回結果,適用於子查詢數據量較大而外表數據量較小時。
結論是,子查詢結果集較大時使用EXISTS,而結果集較小時使用IN可能更有效。對於更詳細的信息和深入理解,可以參考墨天輪原文鏈接。
⑷ 關於sql中in 和 exists 的效率問題,in真的效率低嗎
關於sql中in 和 exists 的效率問題,in真的效率低嗎
in和exists
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。