我们目前有一种情况,一个表有效地具有几个(10至15)布尔标志(不可为空的bit
字段)。不幸的是,在逻辑层面上将其过分简化是不太可能的,因为任何布尔值的组合都是允许的。SQL Server中多位字段的索引
有问题的表是一个事务表,最终可能有数千万行,并且插入和选择性能都相当重要。尽管目前我们对数据的分布还不太确定,但所有标志的组合都应该提供相对良好的基数,即使它成为SQL Server使用的“值得”索引。
典型的选择查询场景可能是仅基于3或4个标记来选择记录,例如, WHERE FLAG3=1 AND FLAG7=0 AND FLAG9=1
。为这些select查询使用的所有标志组合创建单独的索引并不实际,因为它们中会有很多。
鉴于这种情况,有效索引这些字段的建议方法是什么?该表是新的,所以现在还没有需要担心的数据,并且我们在表的实际实施中具有相当大的灵活性。
有迹象表明,我们正在考虑在目前两个主要选项:
- 创建一个单一的指标,其中包括所有的位字段(这可能会包括1个或2个其他
int
领域它总是使用)。我担心的是,鉴于仅包括几个字段的典型用法,这种方法会跳过索引并求助于表扫描。我们称之为选项A(阅读了一些回复后,似乎这种方法效果不好,因为索引中字段的顺序会产生差异,从而无法在所有字段上有效地进行索引)。 - 有效地做我认为SQL Server在内部完成的任务,并使用二元运算符(将数字与1和2,4,8等组合在一起)将位字段编码为单个int字段。我的关注点是我们需要做一些计算来查询这个编码字段,这会再次跳过索引。维护和解决方案的复杂性也是一个问题。我们称之为选项B。 附加信息:参数对于这种方法是我们可以有一个相对简单和短的索引,其中包括表和该字段中的一个或两个其他字段。其他字段将缩小需要评估的记录数量,并且由于编码字段将包含我们所有的位字段,因此SQL Server将能够使用从索引直接检索的数据执行计算(即索引扫描)而不是表(即表格扫描)。
目前,我们非常倾向于选项B。为了完整起见,这将在SQL Server 2008上运行。
任何意见将不胜感激。
编辑:拼写,清晰度,查询示例,关于的附加信息选项B。
有趣的是,感谢您的输入。这种方法确实有一些缺点,例如记录将被“复制”为每个DataFlags_Link记录(并且我不确定是否会导致重大性能下降)。另外,我们的查询通常会检查标志是否为0;即不存在于您的链接表中(对不起,如果我没有在问题中指定这个)。我想,它最终会变得非常混乱。 –
@Dnail:flag = 0检查类似于'... WHERE NOT EXISTS(SELECT * FROM DataFlags_Link dfl WHERE dfl.DataId = Data.id)'并且应该使用索引。 –