【发布时间】:2011-12-28 21:43:24
【问题描述】:
如果我在一条记录中有 8 个布尔值,并且在对表进行查询时始终使用这 8 个值,并且表中的数据是静态的(只读),那么通过索引和获取匹配记录是否更快?查询像 binary(1) 这样的单字节字段,还是将 8 个单独的位列全部添加到索引中更好?
【问题讨论】:
标签: sql sql-server performance sql-server-2008
如果我在一条记录中有 8 个布尔值,并且在对表进行查询时始终使用这 8 个值,并且表中的数据是静态的(只读),那么通过索引和获取匹配记录是否更快?查询像 binary(1) 这样的单字节字段,还是将 8 个单独的位列全部添加到索引中更好?
【问题讨论】:
标签: sql sql-server performance sql-server-2008
单个位字段上的索引基本上是无用的。位具有可怕的选择性,0 或 1,并且可能会被优化器忽略。 8 位字段上的 8 个索引将是优化器忽略的 8 个索引。
字节列上的索引只是选择性稍高一些,有 256 个不同的值。但是,如果您正在寻找单独的位模式,例如“第 3 位打开”,那么就无法将其表示为要寻找的单独值或范围。
结论是,无论您尝试什么,最终都会进行表扫描无论如何。
所以更好地解释你的问题是什么,而不是你的解决方案,也许我们可以考虑一些更有效的方法。
【讨论】:
我会选择一个被索引的字节选项,或者至少一个计算出的 1 字节列与 8 个值一起,以防您需要将它们分开用于其他设施。 (也许是两全其美)
作为一个字节,搜索所有 8 个值的匹配结果的基数比 8 个单独的索引更可能避免临界点 - 即使这 8 个索引可以由引擎连接,我怀疑该基数可能会使查询提示并扫描而不是搜索 - 必须运行测试来证明这一点。
【讨论】:
单字节查询会更快。在内存中构造要比较的字节会快得多。
【讨论】: