2010-12-05 50 views
2

以下是我的查詢來獲取一些對象的大量屬性。無論如何優化和縮短它?優化和縮短聯合查詢

SELECT object_id, value, name FROM attr_text WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_varchar WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_int WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_decimal WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_datetime WHERE object_id IN ('43', '42', '41', '40', '39') 

結果:

43 red color1 
43 blue color2 
43 small size 
42 black color1 
42 big size 
+0

通過標識符鍵入的數據類型命名屬性列表......聽起來像是一個SQL表的工作......哦,等等。 – Hamish 2010-12-05 21:34:15

回答

2

你可以做的最明顯的改進是使用一個合理的模式。

假設這不是一種選擇,我建議的一件事是將UNION更改爲UNION ALL,因爲您可能沒有具有相同名稱和值的多個屬性。 UNION [DISTINCT]只是執行不必要的比較。在任何情況下,您都不會處理當前查詢中具有相同名稱和值的不同值。

+0

嗨,你能解釋更多關於合理的架構。對不起,但英語是我的L2。順便說一句,工會都可能會更快,因爲它不檢查重複的內容。謝謝。 – StoneHeart 2010-12-05 20:40:00

1

我也建議你可以做的最好的改進是使用一個理智的模式。爲了詳細說明,這將大大簡化您的SQL和提高性能,如果你能定義列的離散列表爲對象,像這樣:

create table [Object] (
    [object_id] [int] IDENTITY(1,1) NOT NULL, 
    [color1] [varchar](255) null, 
    [color2] [varchar](255) null, 
    [size] [varchar](255) null 
    ... any other properties.... 
) 

alter table Object 
add constraint PK_object_id 
primary key clustered (
    object_id 
) 

然後,您可以使用一個簡單的選擇只需選擇所有對象:

select * from object where object_id in ('43', '42', '41', '40', '39')