【发布时间】:2012-05-22 14:48:13
【问题描述】:
具有如下表结构:
表 1:客户
CustID(primary key) | CustName(indexed)
----------------------------------
C1 Cust1
C2 Cust2
. Cust3
. Cust.
. Cust.
C10000 Cust10000
表 2:自定义字段
FieldID (primary key) | ID (indexed) | FieldValue
---------------------------------------------------------------------
1 C1 Test
2 C2 Test
3 C3 Test
4 C4 Test
. . Test
. . Test
few millions Z1 Test
"ID" column is indexed.
尝试输出以下内容;
CustID | Field 1 | Field 2 | Field 3 | .... | Field N
----------------------------------------------------------
我试着写一个类似的查询
Select
CustID, A1.FieldValue as [Field 1], A2.FieldValue as [Field 2]
from
Customers
left outer join
CustomFields A1 on Customers.custID = A1.ID
left outer join
CustomFields A2 on Customers.custID = A2.ID
left outer join
CustomFields An on Customers.custID = An.ID
where
custName like 'C%'
由于CustomFields 表有几百万条记录,所以上面的查询表现不佳。现在大约需要 10-12 秒(对于 500 个客户和 6 个字段)
我认为左外连接在这里增加了时间。任何解决问题的想法都会真的很有帮助吗?
平台:SQL Server 2005
更新:
CustomFields 表是一个通用表,它可以包含任何其他实体(供应商、项目等)的字段。
【问题讨论】:
-
你应该从性能的角度了解为什么 EAV 表是一个糟糕的设计选择。
-
@HLGEM 我不会笼统地说 EAV 总是一个糟糕的选择。我实际上已经成功地使用了它。完美吗?当然不是。但通常这些事情是一种权衡。 sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/…
标签: sql sql-server sql-server-2008 tsql sql-server-2005