在 sql server 中比较 nvarchar 和 bigint

Posted

技术标签:

【中文标题】在 sql server 中比较 nvarchar 和 bigint【英文标题】:Comparing nvarchar with bigint in sql server 【发布时间】:2013-07-31 09:04:05 【问题描述】:

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

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

问题是tableA.columnA2nvarchar(50) 类型,而tableB.columnB2bigint 类型。我的问题是 sql server 如何执行这样的查询;将cast bigint 转换为nvarchar 并使用nvarchar 比较运算符进行比较,还是将nvarchar 转换为bigint 并与bigint 比较运算符进行比较。

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

注意:这个查询只处理大约 100,000 条记录,但它需要很长时间。

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

【问题讨论】:

【参考方案1】:

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

见http://msdn.microsoft.com/en-us/library/ms190309.aspx

【讨论】:

+1 令我惊讶的是,很少有开发人员知道存在数据类型优先级。更少人了解匹配对不同类型的负面性能影响。【参考方案2】:

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

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

【讨论】:

我将在tableA 中使用表达式cast(ColumnA2) as bigint) 创建计算列。当索引是数字时,通常扫描索引要便宜得多。 好点!但可能是在表 A 的列中存在一些不是数字的 nvarchars。您至少必须注意表达式。 @FranPl 当然我们可以使用CASE ISNUMERIC...;但似乎不需要这样做,因为原始查询没有这样的测试,也没有失败...... IMO 这是一个糟糕的设计。

以上是关于在 sql server 中比较 nvarchar 和 bigint的主要内容,如果未能解决你的问题,请参考以下文章

SQL server中的nvarchar最大的长度是4000个字吗

在sql server数据库中将一个nvarchar类型的空值转换成decimal(18,3)类型

无法在 SQL Server 2008 中使用 where 子句获取 nvarchar 类型数据

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型

SQL Server 连接中的 nvarchar 或 varchar 或日期