【问题标题】:Does implicit conversion force index scans instead of seeks?隐式转换是否强制索引扫描而不是搜索?
【发布时间】:2019-07-21 12:49:39
【问题描述】:

我将加入表 A 与表 BC。所有三个表都有相似的列和索引,BC 的行数大致相同。但是ABnvarchar 列上有索引,而Cvarchar 列上有索引。

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

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

【问题讨论】:

    标签: tsql indexing sql-server-2014


    【解决方案1】:

    是的,隐式转换可能会导致索引扫描而不是搜索。数据被转换为具有较高data type precedence 的数据类型。正如您在本例中看到的,表cVARCHAR 列被转换为NVARCHAR 值。隐式转换可防止在转换期间丢失数据,即NVARCHAR 列可以比VARCHAR 保存更多不同的字符,因此VARCHAR 从表C 的隐式转换确保将保留表C 中的所有值。 在here 中进一步概述了特定隐式转换方案的详细信息。如果您可以选择并且这不会在其他地方产生任何负面影响,我建议在表 C 中将此列设为 NVARCHAR 数据类型。

    【讨论】:

    • 关于你的最后一点,我假设你的意思是NVARCHAR。我进行了更改(繁琐地删除并重新创建了一堆索引和约束)并确认我的查询现在运行速度提高了 30 倍。
    • 没错。我更新了我的帖子以解决错字。很高兴它有助于查询。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2021-08-12
    • 1970-01-01
    • 2015-01-24
    • 2021-03-19
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多