【发布时间】:2017-07-14 10:31:47
【问题描述】:
我不确定我能否提供足够详细的答案,但我的公司在使用较旧的 mssql 视图时遇到了性能问题。我已将其范围缩小到正确的外部连接,但我不熟悉每个连接都没有“ON”的连接之后的连接结构,如下面的代码 sn-p 所示。
我如何编写下面的连接以提高性能或使用 Join Tablename on 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
【问题讨论】:
-
A
RIGHT OUTER JOIN和LEFT OUTER JOIN需要一个ON子句,就像常规的JOIN一样(或者被连接的表之间的关系必须存在于 WHERE 子句中,这被认为是形式不好)。此外,外部联接的工作方式与内部联接不同,因此如果您不确定它们是如何工作的,最好先了解它们,然后再切换到直接的JOIN(INNER JOIN的简写)。我怀疑在您的WHERE子句中,您可以找到正在连接的表之间的关系,此处省略了ON。 -
在视图中,您确实有两个选择,将查询重写为使用子查询连接而不是连接到整个表,或者确保正确的索引到位(索引视图或基础表)。跨度>
-
此视图上没有 Where 子句。以前的 DBA 在许多视图(和存储过程)上广泛使用了这种堆叠连接系统。我以前从未见过它。我总是看到每个“JOIN”都有一个“ON”,所以我有点难过。我很确定转向派生查询是要走的路,但我没有得到这个堆叠连接的东西。
-
@stevenackley,因为这个可怕的查询调用了另一个视图(这本身就是一个非常糟糕的做法),所以这个视图不可能是可索引的(至少在 SQL Server 中它不会)
-
@HLGEM 视图本身不可索引,但基础表是
标签: sql