gpt4 book ai didi

sql - SQL Server 中多个位字段的索引

转载 作者:行者123 更新时间:2023-12-02 15:51:40 25 4
gpt4 key购买 nike

我们目前的情况是,一个表实际上具有多个(10 到 15)个 bool 标志(不可为空的 bit 字段)。不幸的是,实际上不可能在逻辑层面上简化太多,因为 bool 值的任何组合都是允许的。

所讨论的表是一个事务表,最终可能有数千万行,插入和选择性能都相当关键。虽然我们目前还不太确定数据的分布,但所有标志的组合应该提供相对良好的基数,即使其成为 SQL Server “值得”使用的索引。

典型的选择查询场景可能是仅根据 3 或 4 个标志来选择记录,例如其中 FLAG3=1 和 FLAG7=0 和 FLAG9=1。为这些选择查询使用的标志的所有组合创建单独的索引是不切实际的,因为会有很多标志。

鉴于这种情况,建议采用什么方法来有效索引这些字段?该表是新的,因此还没有需要担心的现有数据,并且我们在表的实际实现中具有相当大的灵 active 。

我们目前正在考虑两个主要选项:

  • 创建一个包含所有位字段的索引(这可能包括 1 或 2 个始终使用的其他 int 字段)。我担心的是,考虑到仅包含几个字段的典型用法,这种方法将跳过索引并诉诸表扫描。让我们称之为选项A(读了一些回复后,似乎这种方法效果不太好,因为索引中字段的顺序会产生差异,导致无法有效索引所有字段)。
  • 有效地执行我认为 SQL Server 内部正在执行的操作,并使用二元运算符(对数字进行 AND 运算和 OR 运算:1、2、4、8 等)将位字段编码为单个 int 字段。我担心的是,我们需要进行某种计算来查询这个编码字段,这将再次跳过索引。该解决方案的维护和复杂性也是一个问题。我们称之为选项B其他信息:这种方法的论点是,我们可以有一个相对简单且简短的索引,其中包括表中的一两个其他字段和此字段。其他字段将缩小需要评估的记录数量,并且由于编码字段将包含我们所有的位字段,因此 SQL Server 将能够使用直接从索引检索的数据(即索引扫描)来执行计算)而不是表(即表扫描)。

目前,我们严重倾向于选项 B。为了完整起见,这将在 SQL Server 2008 上运行。

如有任何建议,我们将不胜感激。

编辑:拼写、清晰度、查询示例、有关选项 B 的附加信息。

最佳答案

单个BIT列通常没有足够的选择性,甚至不能考虑在索引中使用。因此,单个 BIT 列上的索引确实没有意义 - 平均而言,您总是必须搜索表中大约一半的条目(选择性为 50%),因此 SQL Server 查询优化器将改为使用表扫描.

如果您在所有 15 位 列上创建单个索引,那么您就不会遇到这个问题 - 因为您有 15 个是/否选项,您的索引将变得非常有选择性。

问题是:位列的序列很重要。如果您的 SQL 语句使用了至少 1-n 个最左边的 BIT 列,则才会考虑您的索引。

如果你的索引位于

Col1,Col2,Col3,....,Col14,Col15

然后它可能用于使用的查询

  • 第 1 列
  • Col1Col2
  • Col1Col2Col3....

等等。但它不能用于指定Col6,Col9Col14 的查询。

正因为如此,我真的认为在 BIT 列集合上建立索引确实没有多大意义。

这 15 个 BIT 列是您用于查询的唯一列吗?如果没有,我会尝试将您最常用于选择的那些 BIT 列与其他列结合起来,例如在 NameCol7 或其他内容上有索引(然后您的 BIT 列可以向另一个索引添加一些额外的选择性)

关于sql - SQL Server 中多个位字段的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7118640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com