2010-12-05 55 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')