我在查詢返回表中的所有行,除了那些在查詢時常量值列表中的行。例如。 SELECT * FROM table WHERE id IN(%),%保證是值列表,不是子查詢。但是,在某些情況下,此值列表可能長達1000個元素。我應該把它限制在一個更小的子列表中(在這種情況下,只有50-100個元素是最低的),還是會有微不足道的性能增益?PostgreSQL IN()語句仍然很快,最多有1000個參數?
3
A
回答
4
我認爲這是一張大桌子,否則它無關緊要。
根據表的大小和鍵的數量,這可能會變成序列掃描。如果有許多密鑰,Postgres經常選擇不使用它的索引。 鍵越多,序列掃描的機會就越大。
如果您在WHERE
使用另一個索引列,如:
select * from table where id in (%) and my_date > '2010-01-01';
很可能獲取匹配索引(my_date
)列所有行,然後執行內存掃描在他們。
使用JOIN
來永久或臨時表可能,但不必幫助。它仍然需要找到所有的行,或者使用嵌套循環(對於大數據不太可能)或哈希/合併連接。
我想說的解決方案是:
- 使用盡可能少的
IN
鍵越好。 - 儘可能使用其他標準進行索引和查詢。如果
IN
需要對所有行進行內存中掃描,則由於附加標準,至少會有更少的行。
2
使用一個臨時表來加入,提供更好的性能和沒有限制。具有1000個參數的IN()會在任何數據庫中給你帶來問題。
相關問題
- 1. 多參數「IN」準備語句
- 2. hibernate批量插入仍然會生成很多插入語句
- 3. 將參數傳遞給SQL select語句IN子句很奇怪。
- 4. 帶有IN語句的Oracle參數?
- 5. 具有多個值的CASE IN語句
- 6. HSQLDB/Oracle - 在IN子句中有1000多個項目
- 7. 使用參數化IN子句多列
- 8. 具有多個參數的printf語句
- 9. hasOwnProperty仍然與for..in語句一起使用
- 10. 有很多連接和參數的SQL語句
- 11. 很多if語句
- 12. 很多if語句
- 13. Datacontext IN語句中的ExecuteCommand參數
- 14. 使用參數構建sql語句IN?
- 15. R RBCBC和參數化IN語句?
- 16. 搜索範圍很廣 - 仍然沒有解決方案如果語句錯誤
- 17. Hibernate - SQL速度很快,但查詢速度仍然很慢
- 18. 'in(select ...)'語句的多個變量?
- 19. SQL SET多個,與IN語句相同
- 20. Python:返回語句仍然返回沒有從函數
- 21. PostgreSQL結合了多個EXECUTE語句
- 22. PostgreSQL的組合多個選擇語句
- 23. 多個插入語句失敗postgresql/psycopg2
- 24. 很多用戶仍然使用1.5?
- 25. Sqlite3:插入多行仍然很慢
- 26. JS - 如果語句有很多條件
- 27. PHP - IF語句錯誤,仍然運行
- 28. 多參數開關語句
- 29. 一個SELECT語句作爲多參數
- 30. MS Excel - 如果語句(多個參數)
您是否嘗試過基準測試? – Charles 2010-08-03 18:37:57