当前位置 : 主页 > 网络安全 > 测试自动化 >

CAST性能中的SQL VARCHAR与NVARCHAR

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个查询比较两个表中的数据: SELECT DISTINCT MT.Column1, MT.Column2, MT.Column5, MT.Column7, MT.Column9FROM tblMyTable MTWHERE EntryDate = @StartDate AND EntryDate = @EndDate AND NOT EXISTS ( SELECT ID FROM tblOtherTable
我有一个查询比较两个表中的数据:

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),不为null
> Column4 varchar(9),不为null

但实际上所有都只包含数字,长度为9-15位
我想知道这种性能损失的原因是什么?

更新:
执行计划显示如下:

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

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

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

网友评论