我有一个查询比较两个表中的数据: 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位
我想知道这种性能损失的原因是什么?
更新:
执行计划显示如下:
索引列已经是varchar,因此在这种情况下不需要列转换.索引可用于执行计划中更有效的搜索数据访问路径.
这种行为被称为sargable.见http://en.wikipedia.org/wiki/Sargable.