基于多个属性的条件连接,优化

时间:2016-02-09 09:45:30

标签: sql sql-server tsql

考虑以下问题:

SELECT 
  *
 FROM Employees E
 JOIN States S ON E.idEmployee = S.idEmployee
 LEFT JOIN Data1 D1 ON S.data1 = D1.data1
 LEFT JOIN Data2 D2 ON S.data2 = D2.data2
 LEFT JOIN Data3 D3 ON S.data3 = D3.data3

 WHERE (S.idStateType = 1 and D1.attribute1 = value)
    OR (S.idStateType = 2 and D2.attribute2 = value and D2.attribute3 = value)
    OR (S.idStateType = 3 and (D1.attribute1 = value or D3.attribute3 = value))

第二个连接(表Data2)仅在S.idStateType = 2时有效,如果idStateType为<>,则该连接将变得不可用。 2。

如果我将连接条件更改为依赖于idStateType,那么它是否重要(从优化的角度来看,还是设计视图)?

它会变成:

LEFT JOIN data2 DT ON S.idStateType = 2 AND S.data2 = D2.data2

1 个答案:

答案 0 :(得分:0)

在大多数情况下,您的查询应该没问题。 SQL是一种解释型语言,因此它不一定按照您编写的顺序运行,而是根据它认为结果的样子运行它认为最有效的顺序。如果您想真正测试您的结果切换"包括实际执行计划"在" SQL编辑器" SSMS中的栏并以不同的方式运行查询以查看最有效的方法。

您可以像这样重写您的查询:

SELECT 
 *
 FROM Employees E
 JOIN States S ON E.idEmployee = S.idEmployee
 LEFT JOIN Data1 D1 ON S.data1 = D1.data1 AND S.idStateType = 1
  AND D1.attribute1 = value
 LEFT JOIN Data2 D2 ON S.data2 = D2.data2 AND S.idStateType = 2
  and D2.attribute2 = value and D2.attribute3 = value
 LEFT JOIN Data3 D3 ON S.data3 = D3.data3 AND S.idStateType = 3
  and (D1.attribute1 = value or D3.attribute3 = value)

执行此操作可能会加快查询速度,但实际的解释器将根据表结构和索引编制最终结果。使用执行计划可以帮助确定解释器如何运行此查询,并有助于找到最佳的优化方法。