CAST性能中的SQL VARCHAR与NVARCHAR

Ale*_*hak 5 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)) + '%'
    )
Run Code Online (Sandbox Code Playgroud)

它运作正常.但是当我尝试使用CAST(var AS NVARCHAR)时,查询执行时间超过10分钟,并且在最近的将来似乎没有完成.但是当我如上所述更改为CAST(var AS VARCHAR)时,查询将在2-3秒内完成.

CASTed列定义为:

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

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

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

更新:

执行计划显示如下: 在此输入图像描述

Dan*_*man 6

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

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

这种行为被称为sargable.见http://en.wikipedia.org/wiki/Sargable.