【发布时间】:2014-10-01 22:09:42
【问题描述】:
我有一种情况,我必须多次加入一个表。它们中的大多数需要左连接,因为有些值不可用。如何克服多次join时查询性能不佳的问题?
情景
表格
[项目]:ProjectId Guid,名称 VARCHAR(MAX)。
[UDF]:EntityId Guid、EntityType Char(1)、UDFCode Guid、UDFName varchar(20)
[UDFDetail]:UDFCode Guid,描述 VARCHAR(MAX)
关系:
[项目].ProjectId - [UDF].EntityId
[UDFDetail].UDFCode - [UDF].UDFCode
UDF 表根据 UDFName 列保存项目的自定义字段。但是,这些字段的值存储在 UDFDetail 的描述列中。 我有很多项目的自定义列,它们存储在 UDF 表中。
例如,要获取项目的两个字段,我执行以下选择:
SELECT
p.Name ProjectName,
ud1.Description Field1,
ud1.UDFCode Field1Id,
ud2.Description Field2,
ud2.UDFCode Field2Id
FROM
Project p
LEFT JOIN UDF u1 ON
u1.EntityId = p.ProjectId AND u1.ItemName='Field1'
LEFT JOIN UDFDetail ud1 ON
ud1.UDFCode = u1.UDFCode
LEFT JOIN UDF u2 ON
u2.EntityId = p.ProjectId AND u2.ItemName='Field2'
LEFT JOIN UDFDetail ud2 ON
ud2.UDFCode = u2.UDFCode
问题
想象一下上面的选择,但加入了大约 15 个字段。在我的查询中,我已经有大约 10 个字段并且性能不是很好。运行大约需要 20 秒。我对这些表有很好的索引,所以查看执行计划,它只进行索引查找而没有任何查找。关于联接,它需要左联接,因为该特定项目可能不存在字段 1。
问题
是否有更高效的方式来检索数据? 在这样的架构中,您将如何进行查询以检索一个项目的 10 个不同字段?
【问题讨论】:
-
将 UDF 保存为 XML 是否为时已晚?这是一个更好的方法。
-
是的。因为 db 模式来自第三方。所以我无法修改主要结构。我可以在架构中添加自己的表,但我需要保持默认结构不变。
标签: sql sql-server join sql-server-2008-r2 database-performance