2010-08-03 58 views
3

我在查詢返回表中的所有行,除了那些在查詢時常量值列表中的行。例如。 SELECT * FROM table WHERE id IN(%),%保證是值列表​​,不是子查詢。但是,在某些情況下,此值列表可能長達1000個元素。我應該把它限制在一個更小的子列表中(在這種情況下,只有50-100個元素是最低的),還是會有微不足道的性能增益?PostgreSQL IN()語句仍然很快,最多有1000個參數?

+2

您是否嘗試過基準測試? – Charles 2010-08-03 18:37:57

回答

4

我認爲這是一張大桌子,否則它無關緊要。

根據表的大小和鍵的數量,這可能會變成序列掃描。如果有許多密鑰,Postgres經常選擇不使用它的索引。 鍵越多,序列掃描的機會就越大

如果您在WHERE使用另一個索引列,如:

select * from table where id in (%) and my_date > '2010-01-01'; 

很可能獲取匹配索引my_date所有行,然後執行內存掃描在他們。

使用JOIN來永久或臨時表可能,但不必幫助。它仍然需要找到所有的行,或者使用嵌套循環(對於大數據不太可能)或哈希/合併連接。

我想說的解決方案是:

  • 使用盡可能少的IN鍵越好。
  • 儘可能使用其他標準進行索引和查詢。如果IN需要對所有行進行內存中掃描,則由於附加標準,至少會有更少的行。
2

使用一個臨時表來加入,提供更好的性能和沒有限制。具有1000個參數的IN()會在任何數據庫中給你帶來問題。