CONVERT_IMPLICIT在WHERE子句中转换我的varchar字段而不是我的字符串常量

时间:2013-11-18 15:37:13

标签: sql sql-server performance

我正在尝试优化where子句。我读到CONVERT_IMPLICIT会降低速度。

我有一个where子句,用于测试状态(字段strTate)是否在状态缩写列表中。 state字段是varchar(30)。 where子句是:

@State IN ('NY', 'PR', 'VI', 'MAA', 'RI', 'NH', 'ME', 'VT', 'CT', 'NJ', 'AE')

执行计划将每个字符串常量显示为nvarchars,如N'NY'。 然后它为每个缩写执行此操作:

CONVERT_IMPLICIT(nvarchar(3), <dbname>.[dbo].[TblAddress].[strState],0)=N'NY'

我读到因为类型优先,varchar将被隐式转换为nvarchar,而不是相反。但我认为将常量表达式转换一次而不是列表达式一百万次更快,所以我试试这个:

@State IN (
cast('NY' as varchar(30)), 
cast('PR' as varchar(30)), 
cast('VI' as varchar(30)), 
cast('MA' as varchar(30)), 
cast('RI' as varchar(30)), 
cast('NH' as varchar(30)), 
cast('ME' as varchar(30)), 
cast('VT' as varchar(30)), 
cast('CT' as varchar(30)), 
cast('NJ' as varchar(30)), 
cast('AE' as varchar(30)) 
)

执行计划是一样的。我没有看到我的演员表,它仍然将字段转换为nvarchar。我做错了什么?

1 个答案:

答案 0 :(得分:0)

要编写Unicode常量,请使用N前缀,例如N'NY',或者如果您想要转换而不是转换为nvarchar(3)而不是varchar。这意味着SQL Server不会进行任何强制转换。