Sql 修改或提高以下方面的效率';右外连接';查询到内部联接?
我正在努力提高一些查询的效率。由于知识的限制,我一直使用RightOuterJoin从多个表中引入完整的数据集,然后通过where语句将它们剔除。然而,由于我想将“聚集索引”添加到提供模式绑定视图的follow查询中,我只是想知道是否有办法将下面的右外部联接转换为“内部联接”,以便创建索引以减少加载时间 在过去的2-3天里,我一直在这个街区上敲打我的头,任何建议都将不胜感激Sql 修改或提高以下方面的效率';右外连接';查询到内部联接?,sql,tsql,Sql,Tsql,我正在努力提高一些查询的效率。由于知识的限制,我一直使用RightOuterJoin从多个表中引入完整的数据集,然后通过where语句将它们剔除。然而,由于我想将“聚集索引”添加到提供模式绑定视图的follow查询中,我只是想知道是否有办法将下面的右外部联接转换为“内部联接”,以便创建索引以减少加载时间 在过去的2-3天里,我一直在这个街区上敲打我的头,任何建议都将不胜感激 表1显示了客户信息 表2是由表1和表3中的复合键组成的连接表 表3显示了帐户信息 我已经尝试重新安排它,以便将一些
- 表1显示了客户信息
- 表2是由表1和表3中的复合键组成的连接表
- 表3显示了帐户信息
我已经尝试重新安排它,以便将一些where条件加入到连接中,正如我在一些文章中所看到的那样(这显然会在开始时限制数据大小),这据说可以提高效率,但在查看之前和之后的“实时查询统计信息”之后,似乎没有太大区别。示例如下:
你没有提供足够的信息,但我认为这可能会有所帮助。试一试:
SELECT *
FROM dbo.Table1 cd --ClientData
INNER JOIN dbo.Table2 jd --Junction Data
ON cd.[Client ID] = jd.[Client ID]
INNER JOIN dbo.Table3 ai --AccountInformation
ON jd.[Account ID] = ai.[Account ID]
LEFT JOIN dbo.Table4 ao --AccountOfficer
ON jd.[Account Officer] = ao.FullName
WHERE (jd.[Client Type] LIKE '%Customer 1%')
AND (ai.ServiceDescription NOT LIKE '%Nil%')
AND (jd.[Indicative outcome] IS NULL)
AND (jd.[Finalised outcome] IS NULL)
AND (jd.Outcome IS NULL)
AND (jd.ReviewOutcome IS NULL)
AND (ai.[Account Type] = 15)
AND (ai.AccountReviewComplete = 1)
一些提示:
- 使用表别名。这使它更容易阅读和理解
内部联接将仅返回具有匹配链接行的行
- 我为这个官员使用了一个
,因为它名字上的链接可能是错误的(拼写错误!),否则你可能会漏掉行左连接
- 将
与前导的LIKE
一起使用将不允许索引,并使查询速度变慢。如果有可能,您应该用确定的数据集替换%
和客户端类型
(如果可能,使用目录表)服务描述
右连接的NULL
值。我建议您忘记存在右连接
,只使用左连接
。嗨,Shnugo!您的连接工作得很好,但是服务器上从连接表(jd)到Account Officer表(ao)的左连接会在我保存查询后自动更正为左外部连接。我认为这是因为我们的数据设置方式。然而,这比我5个多小时的反复试验更接近我所追求的结果。。非常感谢您的意见!:)@肖尼·高尔德会帮助你的。是一本关于连接类型的好书。您会发现,左连接
和左外连接
是等价的。如果这解决了你的问题,那么最好接受答案(在计票台下方勾选)。这将标记此问题已解决,并将向您和我的帐户支付点数。一旦你自己超过了15分,你会被额外要求对有帮助的贡献进行投票。这就是所谓的thx。快乐编码!
FROM dbo.Table1
RIGHT OUTER JOIN dbo.Table2
ON dbo.Table1.[Client ID] = dbo.Table2.[Client ID]
LEFT OUTER JOIN dbo.Table4
ON dbo.Table2.[Account Officer] = dbo.Table4.FullName
RIGHT OUTER JOIN dbo.Table3
ON dbo.Table2.[Account ID] = dbo.Table3.[Account ID]
AND (dbo.Table3.[Account Type] = 15)
AND (dbo.Table3.AccountReviewComplete = 1)
WHERE (dbo.Table2.[Client Type] LIKE '%Customer 1%')
AND (dbo.Table3.ServiceDescription NOT LIKE '%Nil%')
AND (dbo.Table2.[Indicative outcome] IS NULL)
AND (dbo.Table2.[Finalised outcome] IS NULL)
AND (dbo.Table2.Outcome IS NULL)
AND (dbo.Table2.ReviewOutcome IS NULL)
SELECT *
FROM dbo.Table1 cd --ClientData
INNER JOIN dbo.Table2 jd --Junction Data
ON cd.[Client ID] = jd.[Client ID]
INNER JOIN dbo.Table3 ai --AccountInformation
ON jd.[Account ID] = ai.[Account ID]
LEFT JOIN dbo.Table4 ao --AccountOfficer
ON jd.[Account Officer] = ao.FullName
WHERE (jd.[Client Type] LIKE '%Customer 1%')
AND (ai.ServiceDescription NOT LIKE '%Nil%')
AND (jd.[Indicative outcome] IS NULL)
AND (jd.[Finalised outcome] IS NULL)
AND (jd.Outcome IS NULL)
AND (jd.ReviewOutcome IS NULL)
AND (ai.[Account Type] = 15)
AND (ai.AccountReviewComplete = 1)