2010-05-06 57 views
1

一個朋友寫了一個查詢與以下條件:爲什麼一個查詢在postgres中比另一個查詢更快速〜25ms?

AND (SELECT count(1) FROM users_alerts_status uas 
     WHERE uas.alert_id = context_alert.alert_id 
     AND uas.user_id = 18309 
     AND uas.status = 'read') = 0 

看到這種情況,我建議我們將其更改爲:

AND NOT EXISTS (SELECT 1 FROM users_alerts_status uas 
      WHERE uas.alert_id = context_alert.alert_id 
      AND uas.user_id = 18309 
      AND uas.status = 'read') 

但在測試中,查詢的第一個版本是一致的20間和30ms更快(我們在重啓服務器後測試過)。從概念上講,我錯過了什麼?

+0

比較EXPLAIN ANALYZE的輸出結果會比較有用 - 大概你就是這樣比較時間的嗎? – araqnid 2010-05-06 18:40:16

回答

4

我的猜測是,第一個可以短路;只要它看到符合條件的任何行,就可以返回1的計數。第二個需要檢查每一行(並且每個結果返回一行「1」),所以不會得到速度短路的好處。這就是說,做一個EXPLAIN(或者你的數據庫支持的任何東西)可能會比我的猜想給出更好的見解。

1

從概念上講,我會說你的選擇至少和另一個一樣好,至少稍微優雅一點。我不確定是否應該更慢或更快 - 並且如果那些25ms是相關的。 通常,通過查看EXPLAIN輸出來確定答案。

Postgresql是什麼版本?據說PG 8.4關於NOT EXISTS有一些優化

相關問題