sql-server - SQL Server 在 nvarchar 字符串内部搜索时使用高 CPU

标签 sql-server tsql

查看以下示例。它表明在 unicode 字符串 (nvarchar) 中搜索的错误几乎是在 varchar 字符串中搜索的八倍。与隐式转换相当。正在寻找对此的解释。或者一种更有效地在 nvarchar 字符串中搜索的方法。

use tempdb
create table test
(
    testid int identity primary key,
    v varchar(36),
    nv nvarchar(36),
    filler char(500)
)
go

set nocount on
set statistics time off
insert test (v, nv)
select CAST (newid() as varchar(36)),
    CAST (newid() as nvarchar(36))
go 1000000

set statistics time on
-- search utf8 string
select COUNT(1) from test where v like '%abcd%' option (maxdop 1)
-- CPU time = 906 ms,  elapsed time = 911 ms.

-- search utf8 string using unicode (uses convert_implicit)
select COUNT(1) from test where v like N'%abcd%' option (maxdop 1)
-- CPU time = 6969 ms,  elapsed time = 6970 ms.

-- search unicode string
select COUNT(1) from test where nv like N'%abcd%' option (maxdop 1)
-- CPU time = 6844 ms,  elapsed time = 6911 ms.

最佳答案

Looking for an explanation for this.

NVarchar 是 16 位,Unicode 比较规则比 ASCII 复杂得多 - 同时支持的各种语言的特殊字符需要引用更多处理。

关于sql-server - SQL Server 在 nvarchar 字符串内部搜索时使用高 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4717520/

相关文章:

c# - SQL Server 将表更改通知 Web 服务器

sql-server - 如何压缩查询结果?

sql-server - 创建有效的 SQL 脚本来生成 SQL Server 数据库

sql-server-2008 - 在 CTE 查询中使用聚合函数

sql-server - T-SQL : Need Top N to always return N rows, 即使为空或空白

sql-server - 如何将逗号分隔的数字字符串解析到临时 orderId 表中?

sql-server - 按年、月、日对集合进行分组

sql - T-SQL INSERT INTO 使用 LEFT JOIN

sql-server - 有没有办法在 SQL 2000 中编写图表脚本(或以其他方式保存它们)?

c# - MS 同步框架和 SQL Server Compact