在 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.columnA2
是nvarchar(50)
类型,而tableB.columnB2
是bigint
类型。我的问题是 sql server 如何执行这样的查询;将cast bigint
转换为nvarchar
并使用nvarchar
比较运算符进行比较,还是将nvarchar
转换为bigint
并与bigint
比较运算符进行比较。
另一件事:如果我不得不将这些列类型保留为 tableA.columnA2
、tableB.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 之间的区别?