在 MS-SQL 2012 上,如果要始终在查询中使用“已删除”BIT 字段(即 SELECT xx FROM oo WHERE Deleted = 0),索引“已删除”BIT 字段是否有意义?
或者一个字段是 BIT 的事实是否已经带有某种自动索引来解决性能问题?
在 MS-SQL 2012 上,如果要始终在查询中使用“已删除”BIT 字段(即 SELECT xx FROM oo WHERE Deleted = 0),索引“已删除”BIT 字段是否有意义?
或者一个字段是 BIT 的事实是否已经带有某种自动索引来解决性能问题?
是否索引位字段取决于几个因素,这些因素已在此问题的答案中得到充分解释。 链接231125
当您索引一个包含 1,0 或一些有限值的位字段时,您实际上是在减少与该值匹配的行数。对于较少的记录,这可能会很好,但对于大量数据,它可能会帮助您提高性能。
您可以将位列作为复合索引的一部分
在 0 和 1 的数量之间存在很大差异的情况下,位字段索引可能非常有用,并且您正在搜索两者中较小的一个。
在必须的条件下,索引位字段将毫无用处,因为选择性太低了。大表上的索引扫描不会比表扫描好。如果还有其他条件可用于创建过滤索引,则可以考虑。
如果此字段正在以某种方式改变逻辑的性质,以至于您总是需要在谓词中考虑它,那么您可能会考虑在报告时将数据拆分到其他表中。
正如其他人所提到的,选择性是关键。但是,如果您总是搜索一个或另一个值并且该值具有高度选择性,请考虑使用过滤索引。
为什么不把你的聚集索引放在前面呢?如果删除是增量的,则您必须将填充因子调低,但它们可能是每天的,对吧?而且您的已删除记录比未删除记录多得多?而且,正如您所说,您只查询未删除的记录。所以,是的。不要只索引该列。集群就可以了。
当位列位于索引中的第一个位置时,它可以用作复合索引的一部分。但是,如果您想仅将其用于选择一个值(选择 .... where deleted=1 and another_key=?; but never deleted=0),则使用过滤器在 another_key 上创建索引:
create index i_another on t(another_key) where deleted=1
如果位列应该是复合索引中的最后一个,那么索引中的出现是无用的。但是,您可以包含它以获得更好的性能:
create index i_another on t(another_key) include(deleted)
然后数据库引擎将值与读取索引一起获取,并且不需要从基表页面中获取它。