我正在 SQL Server 2008 R2 上针对下表运行简单查询:
Id (int, not null)
启用 (bit, not null)
两列都有单独的索引。
因此,当我运行以下查询时:
SELECT Id FROM Entities WHERE Enabled = 1
执行计划显示 INDEX_SCAN 已完成(它是由 Enabled 列上的 CONVERT_IMPLICIT 引起的)
当我运行另一个查询时:
SELECT Id FROM Entities WHERE Enabled = '1'
或者
SELECT Id FROM Entities WHERE Enabled = 'true'
或者
SELECT Id FROM Entities WHERE Enabled = CAST(1 AS BIT)
执行计划显示 INDEX_SEEK 已完成。
由于 CONVERT_IMPLICIT 可能会影响更复杂查询的性能,我想知道是什么导致 SQL Server 如此行为?
升级版:
如果我跑
SELECT Id FROM Entities WHERE Enabled = 0
进而
SELECT Id FROM Entities WHERE Enabled = 1
执行计划显示 INDEX_SEEK。在这种情况下,我认为 SQL Server 收集了一些优化统计信息并最终了解到没有理由使用 CONVERT_IMPLICIT。但遗憾的是,我不能保证我的初始查询会以相反的值执行。
我会很高兴我能得到任何澄清。