我有一个查询比较两个表中的数据:
SELECT DISTINCT
MT.Column1,
MT.Column2,
MT.Column5,
MT.Column7,
MT.Column9
FROM tblMyTable MT
WHERE
EntryDate >= @StartDate AND EntryDate <= @EndDate AND
NOT EXISTS (
SELECT ID FROM tblOtherTable
WHERE SomeString LIKE
'X' + CAST(MT.Column1 AS VARCHAR(16)) +
'Y' + CAST(MT.Column3 AS VARCHAR(16)) +
'Z' + CAST(MT.Column4 AS VARCHAR(16)) + '%'
)
一切正常。但是当我尝试使用CAST(var AS NVARCHAR)时,查询执行时间超过10分钟,并且在最近的将来似乎没有完成。但是当我如上所述更改为CAST(var AS VARCHAR)时,查询将在2-3秒内完成。
CASTed列定义为:
但事实上所有都只包含数字,长度为9-15位
我想知道这种性能损失的原因是什么?
更新
执行计划显示如下:
答案 0 :(得分:6)
nvarchar数据类型具有更高的数据类型优先级。因此,对于nvarchar CAST,索引列必须首先转换为nvarchar,并且索引不能用于更有效的搜索结果。
索引列已经是varchar,因此在这种情况下不需要列转换。该索引可用于执行计划中更有效的搜索数据访问路径。
此行为称为sargable。请参阅http://en.wikipedia.org/wiki/Sargable。