3

我正在 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。但遗憾的是,我不能保证我的初始查询会以相反的值执行。

我会很高兴我能得到任何澄清。

4

1 回答 1

3

您是否在 2000 兼容模式下使用数据库?正如我在这里所读到的,如果您使用此兼容模式,您会遇到此“问题”,但您不会使用 2005 或 2008 兼容模式。

因此,如果您需要使用 2000 兼容模式,则必须使用“='1'”比较来避免 CONVERT_IMPLICIT,因为 bit 和 int(或 tiny int)之间的类型优先级使得 bit 必须“升级”诠释。

于 2012-08-31T12:00:45.027 回答