在sql server中比较nvarchar和bigint

时间:2013-07-31 09:04:05

标签: sql sql-server database tsql query-performance

我正在调查以下sql语句的性能问题:

Update tableA 
set columnA1 = columnB1 
from tableB 
where tableA.columnA2 = tableB.columnB2

问题是tableA.columnA2的类型为nvarchar(50),而tableB.columnB2的类型为bigint。我的问题是sql server如何执行这样的查询;它是cast bigintnvarchar并使用nvarchar比较运算符进行比较,还是将nvarchar投射到bigint并与bigint比较运算符进行比较。< / p>

另一件事:如果我必须保留这些列类型tableA.columnA2tableB.columnB2'我该如何重写此查询以提高性能?

注意:此查询仅处理大约100,000条记录,但它需要永远。

提前致谢,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

在比较中,nvarchar将转换为bigint,因为bigint具有更高的优先级

请参阅http://msdn.microsoft.com/en-us/library/ms190309.aspx

答案 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上建立一个索引。