首页 > 解决方案 > 隐式转换是否强制索引扫描而不是搜索?

问题描述

我正在加入表A反对表BC。所有三个表都具有相似的列和索引,B并且C具有大致相同的行数。但是A并且B在列上有索引,而在nvarchar列上C有索引varchar

单独测试,加入B比 join on 快 30-60 倍C。(4 秒对 2-4 分钟。)查看执行计划,B使用索引搜索,同时C使用索引扫描。join on 的细节C提到了列的隐式转换varchar,而 join onB没有提到这样的转换。这就是为什么它使用扫描而不是搜索的原因吗,这可能是它这么慢的原因吗?(另一个潜在问题:索引扫描C的估计执行次数为 1,但实际执行次数约为 8500。)

C是静态历史数据,因此如果有帮助,我可以更改列并重建索引。

标签: tsqlindexingsql-server-2014

解决方案


是的,隐式转换可能会导致索引扫描而不是搜索。数据被转换为具有较高数据类型优先级的数据类型。正如您在这种情况下所看到的,表格的VARCHARc被转换为一个NVARCHAR值。隐式转换可防止在转换期间丢失数据,即,列可以保存比表中的隐式转换NVARCHAR明显更多的不同字符,从而确保保留表 C 中的所有值。此处进一步概述了有关特定隐式转换方案的详细信息。如果您有选择权并且这不会在其他地方产生任何负面影响,我建议您将表中的这一列设为VARCHARVARCHARCCNVARCHAR数据类型。


推荐阅读