Sql “按多个顺序排列”;关于;内连接的条件
我的问题是:在一个典型的Sql “按多个顺序排列”;关于;内连接的条件,sql,tsql,query-optimization,Sql,Tsql,Query Optimization,我的问题是:在一个典型的内部连接中,ON子句中是否有任何执行顺序 我的表在每个表中填充了大约一百万个条目,我需要轻松地连接它们,并希望优化我的查询 下面是我的例子: SELECT * FROM TableA INNER JOIN TableB ON ( [costly validations] ) AND TableB.Date1 > '2016-01-01' AND TableA.Date2 > '2016-01-01' AND TableB.Date1 = Ta
内部连接中,ON
子句中是否有任何执行顺序
我的表在每个表中填充了大约一百万个条目,我需要轻松地连接它们,并希望优化我的查询
下面是我的例子:
SELECT *
FROM TableA
INNER JOIN TableB ON
(
[costly validations]
)
AND
TableB.Date1 > '2016-01-01' AND
TableA.Date2 > '2016-01-01' AND
TableB.Date1 = TableA.Date2 AND
TableA.Field1 = TableB.Field1 AND
TableA.Field2 = TableB.Field2 AND
TableA.Field3 = TableB.Field3 AND
TableA.Field4 = TableB.Field18
成本高昂的验证包括:
(
CAST(
SUBSTRING(
Convert(nvarchar(50), TableA.MoneyField1),
2,
(len(Convert(nvarchar(50), TableA.MoneyField1)) - 1)
) as money
) = TableB.MoneyField2
AND
len(
Convert(
nvarchar(50),
CAST(
SUBSTRING(
Convert(nvarchar(50), TableA.MoneyField1),
2,
(len(Convert(nvarchar(50), TableA.MoneyField1)) - 1)
) as money
)
)
) = len(TableB.MoneyField2)
)
验证想法:在将字符串转换为货币之前,我们正在从第三方应用程序接收的一些字符串中删除非常旧的应用程序中的美元符号($)。第三方应用程序删除了$符号,现在我们正在从数字(oops)中删除一个数字。应用程序已修复,但我们的数据已损坏
问题是:ON
子句中的顺序是否对查询的性能或优化有任何影响?例如,如果我将昂贵的验证放在ON
子句的末尾,是否有任何更改(我没有看到任何更改,我尝试了)
我的假设是No
,因为T-SQL比我聪明
因此:
ON
(
[costly validations]
)
AND
TableB.Date1 > '2016-01-01' AND
TableA.Date2 > '2016-01-01' AND
TableB.Date1 = TableA.Date2 AND
TableA.Field1 = TableB.Field1 AND
TableA.Field2 = TableB.Field2 AND
TableA.Field3 = TableB.Field3 AND
TableA.Field4 = TableB.Field18
与此相比:
ON
TableB.Date1 > '2016-01-01' AND
TableA.Date2 > '2016-01-01' AND
TableB.Date1 = TableA.Date2 AND
TableA.Field1 = TableB.Field1 AND
TableA.Field2 = TableB.Field2 AND
TableA.Field3 = TableB.Field3 AND
TableA.Field4 = TableB.Field18 AND
(
[costly validations]
)
评估的顺序没有保证。在一个ON
子句中,以及在多个ON
子句和WHERE
子句中。1
该标准所要求的只是按照特定的逻辑顺序对某些子句进行求值,数据库系统可以自由地重新排序求值,只要它们生成的结果与逻辑顺序一致。然而,在某些情况下,SQL甚至超出了这一范围——这导致了使用有保证的保护编写代码非常困难的情况(例如,如果你想做a/b
,并想避免被零除的错误,你必须跳转,以确保你永远不会看到该错误。你不能只写b!=0和a/b=
)
1这与许多其他语言不同,在这些语言中,布尔和
和或
运算符被定义为执行短路,并且只有在左侧表达式不足以确定整个结果时才计算其右侧表达式。无法保证计算顺序。两者都在si中在
子句上的单个,以及在
子句和WHERE子句上的多个。1
该标准所要求的是,某些子句按照特定的逻辑顺序进行求值,数据库系统可以自由地重新排序求值,前提是它们生成的结果与逻辑顺序一致。不过,在某些情况下,SQL甚至超出了这一步,导致编写代码非常困难h保证安全(例如,如果你想做a/b
,并想避免被零除的错误,你必须跳转,以确保你永远不会看到该错误。你不能只写b!=0和a/b=
)
1这与许多其他语言不同,在这些语言中,布尔和
和或
运算符被定义为执行短路,并且只有在左手表达式不足以确定整个结果时,才计算右手表达式