oracle 使用 in 關鍵字查詢且集合數量大小大於1000
Oracle MyBatis 提示:java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表達式數為 1000
產生原因:oracle 使用 in 關鍵字查詢且集合數量大小大於1000
解決辦法:
第一種、將集合拆分,使用or 連接。
select * from A where id in (1, 2, …, 1000) or id in (1001, …, 1999)
第二種、將集合修改為查詢語句
select * from A where id in (select id from B)
第三種、與 第二種 類似,使用 with as 語法,把條件封裝成一個表
with temp as (select * from B)
select * from A where id in (select id from temp)
關於SQL in查詢(單次查詢)和for循環查詢(多次查詢) 效率論證
for查詢:需要循環連接數據庫,不僅占用大量連接池,而且多次的網絡傳輸更是拖慢了總體的速度。(一般做過代碼分析的都知道,程序其實並不會消耗太多時間,反而是網絡請求消耗的時間較多)
in查詢
首先 將多次連接直接降為一次,不僅節省連接池資源,且只進行一次網絡傳輸。
其次 就是大家在考慮的in查詢的問題。不妨這么去想:對於數據庫自身的優化來說,數據庫本身完全可以將in查詢轉為多次查詢,然后組合起來返回結果。-- 這類似於for查詢,但是比程序中for查詢節省了多次連接和多次網絡傳輸。數據庫自身起碼會優化到這樣,那也就不必擔心其效率比for查詢低了
sql in 的替代方法
表a 有20w條數據 有個主鍵自動增長的id ,
這時,程序傳過來4000多個id,中間用,隔開,我目前查詢的寫法是用in(4000個id),但這中方法太慢了 我想找個快的寫法,能快速的查到數據
通過函數先把id轉換成表,然后用join的方法select a.* from 源表 a inner join (轉換后的id表) b on a.id=b.id