2009-07-28 84 views
1

問題:我們有一個非常複雜的搜索查詢。如果其結果產生的行數太少,我們通過使用相同查詢的較不嚴格版本的UNION查詢來擴展結果。SQL性能:UNION或ORDER BY

我們正在討論不同的方法在質量上會更快和/或更好。而不是UNIONing,我們將創建一個自定義的sql函數,它將返回匹配的分數。然後,我們可以簡單地按照匹配的分數排序。

關於性能:它會比聯盟慢嗎?

我們使用PostgreSQL。

任何建議將不勝感激。

非常感謝您 最大

回答

2

您想要通過自定義函數的「返回值」來訂購嗎?那麼數據庫服務器就不能使用它的索引。必須爲表格中的每條記錄(未用WHERE子句排除)計算得分並將其存儲在某個臨時存儲/表格中。然後在該臨時表上執行該命令。所以這很容易會比你的聯合查詢慢(當然取決於你的聯合聲明)。

6

如果你衡量現實環境中這兩種方法的性能的一種明確答案只能給出。其他的一切都是猜測。

這裏有很多變數 - 表格的結構和數據類型,數據的分佈,你有什麼樣的指數,服務器的負載有多大 - 真的要預測任何結果幾乎是不可能的。

所以真的 - 我最好的建議是:在實時系統上,用實時數據,而不僅僅是幾十個測試行 - 並測量,測量,測量。

Marc

+0

+1聲音建議 – AdaTheDev 2009-07-28 16:20:24

+0

聽起來有點令人沮喪,但最常見的情況是,這幾乎是唯一可用的建議...... – 2009-07-28 16:21:06

1

加我有點...

+1 marc_s,完全與他所說的同意 - 我只會說,你需要用真實的數據量的測試數據庫服務器上測試,而不是到生產服務器。

對於函數方法,將爲每個記錄執行該函數,然後按照該結果進行排序 - 這不會是索引列,因此我希望看到對性能有負面影響。然而,與其他方法的累積時間相比,這種影響有多大,以及它是否實際上是負面的,只能通過測試來了解。

1

PostgreSQL 8.3及以下,UNION隱含DISTINCT這暗示排序,這意味着ORDER BYUNIONDISTINCT總是相同的效率,由於東北黑鈣土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就有可能使用HashAggregateUNION這可能會更快(幾乎總是),但不保證有序的輸出。

同一查詢返回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 DISTINCTUNION/INTERSECT/EXCEPT不再總是產生有序輸出(湯姆)

在新 PostgreSQL版本

所以,我建議,使用UNION,因爲它更靈活。

在舊版本中,性能會相同。