我正在尝试优化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。我做错了什么?
答案 0 :(得分:0)
要编写Unicode常量,请使用N前缀,例如N'NY',或者如果您想要转换而不是转换为nvarchar(3)而不是varchar。这意味着SQL Server不会进行任何强制转换。