SQL与视图连接

时间:2014-12-05 16:54:22

标签: sql sql-server performance join sql-view

我有一个视图,现在正在与一些额外的表连接另外两个视图。 它很慢。

我的经验告诉我,因为默认情况下视图没有编入索引。我试图在每个上面创建一个索引,但由于它们有自联接或内部查询,所以不可能。

我的问题是: 在我看来,一般不建议加入观点。那么,简而言之,没有办法将代码从一个视图重用到另一个视图中?示例:视图A计算百分比,视图B计算使用视图A中的百分比加上其他表/视图中的其他信息的其他内容。什么是最好的方法?你真的必须从视图A复制代码到视图B,所以它使用原始表的索引吗?

观点(简化视图,显示问题):

查看A(计算百分比):

SELECT     dbo.tblPopAgeGrp.RevID, dbo.tblPopAgeGrp.VarID, dbo.tblPopAgeGrp.LocID, 
                      dbo.tblPopAgeGrp.TimeID, dbo.tblPopAgeGrp.AgeID, tPAGT.AgeID AS AgeTotal, 
                      100 * dbo.tblPopAgeGrp.PopMale / tPAGT.PopMale AS PopMalePerc, 
                      100 * dbo.tblPopAgeGrp.PopFemale / tPAGT.PopFemale AS PopFemalePerc, 
                      100 * dbo.tblPopAgeGrp.PopTotal / tPAGT.PopTotal AS PopTotalPerc
FROM         dbo.tblPopAgeGrp
INNER JOIN   dbo.tblPopAgeGrp tPAGT
        ON dbo.tblPopAgeGrp.GroupID = tPAGT.GroupID
        AND dbo.tblPopAgeGrp.AgeID = 700

单独查看A,因为记录太多,需要很长时间才能执行。但是,在视图B中,记录根据VersionID进行过滤。

查看B(从另一个视图中获取包含其他信息的视图A中的百分比):

SELECT     vPAGP.VersionID, 
           vPAGP.LocationID AS LocID, 
           vPAGP.PopTotalPerc  AS pPopTot,
           vPAGP.PopMalePerc   AS pMale,
           vPAGP.PopFemalePerc AS pFemale,
           vPAGPSR.PopMaleSexRatio    AS SexRatio,
           vPAGPSR.PopFemaleSexRatio  AS FemRatio
FROM       dbo.vwA AS vPAGP
INNER JOIN dbo.vwOther AS vPAGPSR
           ON vPAGPSR.GroupID = vPAGP.GroupID
WHERE vPAGP.VersionID=10

在没有过滤器的情况下执行View A需要10分钟。仅对VersionID = 10执行它,它将在10秒内执行。视图vwOther执行得非常快。

谢谢!

1 个答案:

答案 0 :(得分:2)

当你陈述时,你是不正确的#34;在我看来,一般不建议加入观点。"

视图可以与其他视图结合使用,并且可以很好地执行,只要所有JOIN都可以优化并且创建了适当的索引,并且在视图中完成的任何过滤都是可优化的并且具有适当的索引已创建。

基于其他视图的视图应该执行以及为了分解视图而编写的相同查询。如果您需要进一步的帮助,请发布您问题中涉及的所有观点的定义。