Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以设置sql视图,以便仅在需要时执行任何连接?_Sql_Performance_Sql Server 2008 - Fatal编程技术网

是否可以设置sql视图,以便仅在需要时执行任何连接?

是否可以设置sql视图,以便仅在需要时执行任何连接?,sql,performance,sql-server-2008,Sql,Performance,Sql Server 2008,我在查看性能方面遇到了一些问题。特别是在不需要连接时执行一些昂贵的连接。我已设法将问题简化为最简单的情况,并使用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.

我在查看性能方面遇到了一些问题。特别是在不需要连接时执行一些昂贵的连接。我已设法将问题简化为最简单的情况,并使用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
在此查询中,正在执行不必要的联接。我知道为什么会发生这种情况——如果每行有多个EmailAddress条目,结果就会不同。但是,在这种特殊情况下,映射是1-1,并且始终是。有没有办法防止这种连接发生,以便生成的查询等于以下内容

select P.FirstName
from Person.Person P

这个简单的案例看起来确实像是微观优化,但我已经正确地分析并确定了不必要的连接,在我的情况下,这是一个性能问题——我保证

您可以将此视图设置为索引视图。这样可以提高性能,并且不会在每次从视图中获取数据时都有连接


由于索引视图为联接查询的结果集创建单独的物理存储,因此每次访问此视图时,都将与从单个表中访问相同。

您可以将此视图设为索引视图。这样,它将提高性能,并且不会在每次从数据库中提取数据时都有联接视图

由于索引视图会一次性为联接查询的结果集创建单独的物理存储,因此无论何时访问此视图,都与从单个表访问相同。

CREATE UNIQUE INDEX ix
  ON Person.EmailAddress(BusinessEntityID) 
以确保没有多个匹配项。这改变了计划

以前

之后

以确保没有多个匹配项。这改变了计划

以前

之后


也许您应该使用person表中的最新查询,而不是persondetails\u视图中的人员数据?我认为在这个场景中使用persondetails_视图也是不必要的;再一次,我把它分解成我能做的最简单的例子。我觉得发布一个一次连接10个以上表的大型sql视图对于这个问题来说是不必要的复杂。也许您应该使用person表的最新查询,而不是person数据的persondetails\u视图?我认为在这个场景中使用persondetails_视图也是不必要的;再一次,我把它分解成我能做的最简单的例子。我觉得发布一个一次连接10个以上表的大型sql视图对于这个问题来说是不必要的复杂。视图引用的基础表更新得如此频繁,索引视图可能会更糟。视图引用的基础表更新得如此频繁,索引视图可能会更糟。谢谢,这非常有效。对于后续操作,如果EmailAddress确实有多个匹配项,但您执行查询的方式并不重要,例如“从PersonDetails\u视图中选择不同的名字,会有类似的解决方案吗?@John-看起来像创建视图PersonDetails\u视图,就像选择P.FirstName,P.LastName,A.EmailAddress from Person.Person P left outer join选择maxEmailAddress作为EmailAddress,BusinessEntityID from Person.EmailAddress group by BusinessEntityID A ON P.BusinessEntityID=A.BusinessEntityID进行简化,但是选择中包含EmailAddress的计划更复杂。再次感谢您的帮助。这似乎确实简化了查询,但确实使查询更加复杂。我将不得不介绍一些,看看哪个选项对我最合适。谢谢,这非常有效。对于后续操作,如果EmailAddress确实有多个匹配项,但您执行查询的方式并不重要,例如“从PersonDetails\u视图中选择不同的名字,会有类似的解决方案吗?@John-看起来像创建视图PersonDetails\u视图,就像选择P.FirstName,P.LastName,A.EmailAddress from Person.Person P left outer join选择maxEmailAddress作为EmailAddress,BusinessEntityID from Person.EmailAddress group by BusinessEntityID A ON P.BusinessEntityID=A.BusinessEntityID进行简化,但是选择中包含EmailAddress的计划更复杂。再次感谢您的帮助。这似乎确实简化了查询,但确实使查询更加复杂。我将不得不简要介绍一些,看看哪个选项最适合我。