我不确定我能否提供足够的答案详细信息,但是我的公司在旧版mssql视图中遇到了性能问题。我将它缩小到了右外连接,但我不熟悉每个连接没有“开”的连接结构,如下面的代码片段所示。堆叠连接性能差
如何在下面编写连接以提高性能或简化格式在Field1上加入表名称= field2格式?
FROM dbo.tblObject AS tblObject_2
JOIN dbo.tblProspectB2B PB ON PB.Object_ID = tblObject_2.Object_ID
RIGHT OUTER JOIN dbo.tblProspectB2B_CoordinatorStatus
RIGHT OUTER JOIN dbo.tblObject
INNER JOIN dbo.vwDomain_Hierarchy
INNER JOIN dbo.tblContactUser
INNER JOIN dbo.tblProcessingFile WITH (NOLOCK)
LEFT OUTER JOIN dbo.enumRetentionRealization AS RR ON RR.RetentionRealizationID = dbo.tblProcessingFile.RetentionLeadTypeID
INNER JOIN dbo.tblLoan
INNER JOIN dbo.tblObject AS tblObject_1 WITH (NOLOCK) ON dbo.tblLoan.Object_ID = tblObject_1.Object_ID ON dbo.tblProcessingFile.Loan_ID = dbo.tblLoan.Object_ID ON dbo.tblContactUser.Object_ID = dbo.tblLoan.ContactOwnerID ON dbo.vwDomain_Hierarchy.Object_ID = tblObject_1.Domain_ID ON dbo.tblObject.Object_ID = dbo.tblLoan.ContactOwnerID ON dbo.tblProspectB2B_CoordinatorStatus.Object_ID = dbo.tblLoan.ReferralSourceContactID ON tblObject_2.Object_ID = dbo.tblLoan.ReferralSourceContactID
'RIGHT OUTER JOIN'和'LEFT OUTER JOIN'需要一个'ON'子句,就像普通的'JOIN'一样(或者在WHERE子句中表之间的关系必须存在,这被认为是不好的形成)。此外,外部连接的工作方式与内部连接不同,因此如果您不确定其工作方式,最好在切换到“JOIN”(这是“INNER JOIN”的简写)之前了解它们。我怀疑在你的'WHERE'子句中,你可以找到加入的表之间的关系,这里省略了'ON'。 – JNevill
在视图中,您确实有两个选项,将查询重写为使用子查询连接而不是连接到整个表,或确保适当的索引就位(索引视图或基础表)。 –
这个视图没有Where子句。以前的DBA在许多视图(和存储过程)上广泛使用了这种堆叠联接系统。我从来没有见过它。对于每个“加入”,我总是看到一个“ON”,所以我有点难过。 我很确定转移到派生查询是要走的路,但我没有得到这个堆叠连接的东西。 –