我正在调查以下sql语句的性能问题:
Update tableA
set columnA1 = columnB1
from tableB
where tableA.columnA2 = tableB.columnB2
问题是tableA.columnA2
的类型为nvarchar(50)
,而tableB.columnB2
的类型为bigint
。我的问题是sql server如何执行这样的查询;它是cast bigint
到nvarchar
并使用nvarchar
比较运算符进行比较,还是将nvarchar
投射到bigint
并与bigint
比较运算符进行比较。< / p>
另一件事:如果我必须保留这些列类型tableA.columnA2
,tableB.columnB2
'我该如何重写此查询以提高性能?
注意:此查询仅处理大约100,000条记录,但它需要永远。
提前致谢,非常感谢您的帮助。
答案 0 :(得分:3)
在比较中,nvarchar
将转换为bigint
,因为bigint
具有更高的优先级
答案 1 :(得分:2)
编辑:
我假设转换始终是更新表的数据类型。但是这是错误的! @ podiluska的答案是正确的,因为我测试了类似于问题的声明,并且在更新声明的计划中,您看到转换始终为bigint时比较bigint和nvarchar列,无论bigint或nvarchar列是否在更新表的一侧:查询计划始终包含nvarchar列的表达式Scalar Operator(CONVERT_IMPLICIT(bigint,[schema1].[table1].[col1],0))
。
为了提高性能,您可以使用表达式cast(ColumnA2 as bigint)
在nvarchar列中创建表B中的计算列。然后你可以在这个和columnB1上建立一个索引。