0

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

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

问题是tableA.columnA2is of typenvarchar(50)tableB.columnB2is of type bigint。我的问题是 sql server 如何执行这样的查询;使用比较运算符执行它并进行比较,还是转换为cast bigint比较运算符并进行比较。nvarcharnvarcharnvarcharbigintbigint

另一件事:如果我不得不让这些列类型保持原样tableA.columnA2tableB.columnB2'我该如何重写这个查询来提高性能?

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

在此先感谢,非常感谢您的帮助。

4

2 回答 2

3

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

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

于 2013-07-31T09:22:11.017 回答
2

编辑:我假设转换始终是更新表的数据类型。但这是错误的!@podiluska 的答案是正确的,因为我使用类似于问题中的语句进行测试,并且在更新语句的计划中,您会看到在比较 bigint 和 nvarchar 列时转换始终为 bigint,无论是否bigint 或 nvarchar 列位于更新表的一侧:查询计划始终包含Scalar Operator(CONVERT_IMPLICIT(bigint,[schema1].[table1].[col1],0))nvarchar 列的表达式。

为了提高性能,您可以使用表达式在表 B 中使用 nvarchar 列创建计算列cast(ColumnA2 as bigint)。然后你可以在这个和 columnB1 上建立一个索引。

于 2013-07-31T09:08:22.490 回答