2013-09-23 113 views
1

我有一個表,它給出了兩個項目之間的值。該表格包含以下列:聯盟SQL查詢性能

itemA | itemB | value 
1  | 2  | 125 
1  | 3  | 56 
3  | 2  | 78 
2  | 4  | 24 
4  | 1  | 994 
3  | 4  | 7 

我強調對稱值不會重複。例如,現在有一行itemA = 2和itemB = 1,值= 125,因爲此數據已經存儲在itemA = 1和itemB = 2中。

現在我想要獲取項目1, 2和3,但也有對稱值。類似的東西在SQL結果集:

itemA | itemB | value 
1  | 2  | 125 
1  | 3  | 56 
2  | 1  | 125 
2  | 3  | 78 
3  | 1  | 56 
3  | 2  | 78 

我成功獲得,與follwoing SQL查詢:

select itemA as iA, itemB as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
union all 
select itemB as iA, itemA as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
order by iA, iB; 

但是,它一直對我說,UNION操作符是性能殺手,這表格實際上有超過100 M行。但經過數小時的腦力激盪後,我沒有找到另一種方法來解決這個問題。請你能看到一個更好,更高性能的SQL查詢來獲得這個結果集。

預先感謝您

+0

對於codereview比stackoverflow更多。順便說一下,提到數據庫管理系統真的從來沒有受傷... – gdoron

+0

是的,數據庫是:Oracle數據庫11g企業版版本11.2.0.3.0 - 64位生產 – Comencau

回答

2

UNION可以是性能殺手,因爲它是隻保留不同的項目。
UNION ALL另一方面簡單地連接結果集,所以應該沒有顯着的性能影響。

但是你真的應該測量一下它,或者檢查一下解釋說明。