【发布时间】:2013-04-22 09:45:32
【问题描述】:
我在查看性能方面遇到了一些问题。特别是在不需要时执行一些昂贵的连接。我已经设法将问题简化为最简单的情况,并使用 AdventureWorks 示例数据库创建了以下视图,该视图将人名和电子邮件地址组合在一起。
create view PersonDetails_View
as
select P.FirstName, P.LastName, A.EmailAddress
from Person.Person P
left outer join Person.EmailAddress A
ON P.BusinessEntityID = A.BusinessEntityID
如果我对此视图运行以下查询:
select FirstName from PersonDetails_View
生成的查询等于:
select P.FirstName
from Person.Person P
left outer join Person.EmailAddress A
ON P.BusinessEntityID = A.BusinessEntityID
在此查询中执行了不必要的连接。我知道为什么会这样 - 如果每个 Person 行有多个 EmailAddress 条目,结果会有所不同。但是,在这种特殊情况下,映射是 1-1,并且总是如此。有没有办法防止这种连接发生,使生成的查询等于以下?
select P.FirstName
from Person.Person P
(这个简单的案例看起来确实像微优化,但我已经正确分析并识别了视图中不必要的连接,这是我的情况下的性能问题 - 我保证!)
【问题讨论】:
-
也许您应该使用最新的查询(来自人员表,而不是来自 persondetails_view)来获取人员数据?我认为在这种情况下使用 persondetails_view 也是不必要的;)
-
再次,我将其分解为最简单的示例。我觉得发布一个一次连接超过 10 个表的大型 sql 视图对于这个问题来说是不必要的复杂。
标签: sql performance sql-server-2008