CAST性能中的SQL VARCHAR与NVARCHAR

时间:2014-10-03 10:44:41

标签: sql sql-server performance varchar

我有一个查询比较两个表中的数据:

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列定义为:

  • Column1 int,not null,
  • Column3 varchar(50),not null
  • Column4 varchar(9),not null

但事实上所有都只包含数字,长度为9-15位

我想知道这种性能损失的原因是什么?

更新

执行计划显示如下: enter image description here

1 个答案:

答案 0 :(得分:6)

nvarchar数据类型具有更高的数据类型优先级。因此,对于nvarchar CAST,索引列必须首先转换为nvarchar,并且索引不能用于更有效的搜索结果。

索引列已经是varchar,因此在这种情况下不需要列转换。该索引可用于执行计划中更有效的搜索数据访问路径。

此行为称为sargable。请参阅http://en.wikipedia.org/wiki/Sargable