【发布时间】:2018-10-21 15:45:37
【问题描述】:
这很快:
SELECT *
FROM [Assignable Assessors]
WHERE ([Certificate Type ID] = 'TAA')
但这很慢:
DECLARE @__targetLevel_4 AS nvarchar(8);
SET @__targetLevel_4 = 'TAA';
SELECT *
FROM [Assignable Assessors]
WHERE ([Certificate Type ID] = @__targetLevel_4)
这怎么可能?
[Assignable Assessor]是一个视图,它使用了包含很多“最新记录的一组选择”。
[Certificate Type ID] 的类型为 nvarchar(8),并且选择中没有显式类型转换。
我正在使用 Azure SQL 数据库。
【问题讨论】:
-
也可以在第二个语句的末尾使用
OPTION(RECOMPILE) -
WHERE ([Certificate Type ID] = N'TAA')怎么样(注意 N)。与varchar值相比,这是参数化查询作为第一个查询的更好表示,并且参数化查询使用 NVarchar。添加N也会使值变成 nvarchar。 -
Igor 所说的——两个查询中的字符串类型是不同的。如果该字段是 varchar 而不是 nvarchar (Unicode),则服务器必须 convert 值。如果字段具有不兼容的排序规则,这可能会强制服务器忽略字段上的任何索引。
[Certificate Type ID]是如何定义的?
标签: sql sql-server tsql azure-sql-database ssms