【发布时间】:2016-04-07 19:14:08
【问题描述】:
编辑:查询计划链接到:
所以我正在研究一个 MSSQL 系统,并且我正在重写一些查询。我决定主要通过将谓词从 WHERE 子句中移出并将它们填充到我的 JOIN 子句中来使用我的谓词。当我这样做时,它返回的行数是原来的两倍,执行时间从几秒到几分钟。
我想知道发生了什么,因为我认为查询分析器通常会将谓词填充到 JOIN 子句中,因为这些行最终会被丢弃。
任何关于为什么这些查询不等价的帮助将不胜感激,我只是不够强大,不知道在哪里看..
好查询:
FROM [CONNECT_PROD].[dbo].[CRM_C005] c005
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_FI] fi ON c005.ID_FI = fi.ID
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_CPPE] kp ON c005.ID_PE = kp.ID_PE AND fi.id = kp.id_fi
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_KA] vko ON c005.F7010 = vko.code
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_VF] vf on vf.id_fi = fi.id and vf.VerkOrg = vko.code
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_KA] land ON fi.land = land.code
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_KA] title ON kp.Titel = title.code and title.loskz = 0 and title.KatSperre = 0 and title.sprachenr = 0 and title.katnr = 23
WHERE kp.loskz = 0
and vko.loskz = 0
and vko.KatSperre = 0
and vko.sprachenr = 0
and vko.katnr = 274
and vko.ExtKey = '0014'
and land.loskz = 0
and land.KatSperre = 0
and land.sprachenr = 1000
and land.katnr = 2
and fi.loskz = 0
and fi.F7029 = 0
and vf.loskz = 0
and vf.F7023 = 0
and vf.F7152 = 0
and c005.del = 0
and kp.f7017 = 0
错误查询:
FROM [CONNECT_PROD].[dbo].[CRM_C005] c005
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_FI] fi ON c005.ID_FI = fi.ID AND fi.loskz = 0 AND fi.F7029 = 0
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_CPPE] kp ON c005.ID_PE = kp.ID_PE AND fi.id = kp.id_fi AND kp.loskz = 0 AND kp.f7017 = 0
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_KA] vko ON c005.F7010 = vko.code AND vko.loskz = 0 AND vko.KatSperre = 0 AND vko.sprachenr = 0 AND vko.katnr = 274 and vko.ExtKey = '0014'
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_VF] vf on vf.id_fi = fi.id and vf.VerkOrg = vko.code AND vf.loskz = 0 AND vf.F7023 = 0 AND vf.F7152 = 0
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_KA] land ON fi.land = land.code AND land.loskz = 0 AND land.KatSperre = 0 AND land.sprachenr = 1000 AND land.katnr = 2
LEFT JOIN [CONNECT_PROD].[dbo].[CRM_KA] title ON kp.Titel = title.code and title.loskz = 0 and title.KatSperre = 0 and title.sprachenr = 0 and title.katnr = 23
WHERE c005.del = 0
【问题讨论】:
-
请提供执行计划
-
查询是不一样的,因为在左外连接的情况下,条件只会限制从外连接表中获取的行,并且仍然会从 CRM_C005 中获取行,但在原始查询中它将离开完全取出行——因此在 where 子句中包含与外连接相关的任何内容都会将其变成内连接。
-
@dfundako SO 有首选上传位置吗?
-
@dfundako 完成,计划已添加。
标签: sql-server tsql join