問題:我們有一個非常複雜的搜索查詢。如果其結果產生的行數太少,我們通過使用相同查詢的較不嚴格版本的UNION查詢來擴展結果。SQL性能:UNION或ORDER BY
我們正在討論不同的方法在質量上會更快和/或更好。而不是UNIONing,我們將創建一個自定義的sql函數,它將返回匹配的分數。然後,我們可以簡單地按照匹配的分數排序。
關於性能:它會比聯盟慢嗎?
我們使用PostgreSQL。
任何建議將不勝感激。
非常感謝您 最大
問題:我們有一個非常複雜的搜索查詢。如果其結果產生的行數太少,我們通過使用相同查詢的較不嚴格版本的UNION查詢來擴展結果。SQL性能:UNION或ORDER BY
我們正在討論不同的方法在質量上會更快和/或更好。而不是UNIONing,我們將創建一個自定義的sql函數,它將返回匹配的分數。然後,我們可以簡單地按照匹配的分數排序。
關於性能:它會比聯盟慢嗎?
我們使用PostgreSQL。
任何建議將不勝感激。
非常感謝您 最大
您想要通過自定義函數的「返回值」來訂購嗎?那麼數據庫服務器就不能使用它的索引。必須爲表格中的每條記錄(未用WHERE子句排除)計算得分並將其存儲在某個臨時存儲/表格中。然後在該臨時表上執行該命令。所以這很容易會比你的聯合查詢慢(當然取決於你的聯合聲明)。
如果你衡量現實環境中這兩種方法的性能的一種明確答案只能給出。其他的一切都是猜測。
這裏有很多變數 - 表格的結構和數據類型,數據的分佈,你有什麼樣的指數,服務器的負載有多大 - 真的要預測任何結果幾乎是不可能的。
所以真的 - 我最好的建議是:在實時系統上,用實時數據,而不僅僅是幾十個測試行 - 並測量,測量,測量。
Marc
加我有點...
+1 marc_s,完全與他所說的同意 - 我只會說,你需要用真實的數據量的測試數據庫服務器上測試,而不是到生產服務器。
對於函數方法,將爲每個記錄執行該函數,然後按照該結果進行排序 - 這不會是索引列,因此我希望看到對性能有負面影響。然而,與其他方法的累積時間相比,這種影響有多大,以及它是否實際上是負面的,只能通過測試來了解。
在PostgreSQL 8.3
及以下,UNION
隱含DISTINCT
這暗示排序,這意味着ORDER BY
,UNION
和DISTINCT
總是相同的效率,由於東北黑鈣土2個贈品用於在排序。
在PostgreSQL 8.3
,該查詢返回的結果進行排序:
SELECT *
FROM generate_series(1, 10) s
UNION
SELECT *
FROM generate_series(5, 15) s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
由於PostgreSQL 8.4
就有可能使用HashAggregate
爲UNION
這可能會更快(幾乎總是),但不保證有序的輸出。
同一查詢返回PostgreSQL 8.4
如下:
SELECT *
FROM generate_series(1, 10) s
UNION
SELECT *
FROM generate_series(5, 15) s
10
15
8
6
7
11
12
2
13
5
4
1
3
14
9
,正如你可以看到resuts不排序。
PostgreSQL
change list提到了這一點:
在新
SELECT DISTINCT
和UNION/INTERSECT/EXCEPT
不再總是產生有序輸出(湯姆)
PostgreSQL
版本
所以,我建議,使用UNION
,因爲它更靈活。
在舊版本中,性能會相同。
+1聲音建議 – AdaTheDev 2009-07-28 16:20:24
聽起來有點令人沮喪,但最常見的情況是,這幾乎是唯一可用的建議...... – 2009-07-28 16:21:06