小编Dan*_*l B的帖子

SQL Server中多个位字段的索引

我们目前有一个场景,其中一个表实际上有几个(10到15)布尔标志(不是可空bit字段).不幸的是,在逻辑层面上实际上不太可能简化这一点,因为布尔值的任何组合都是允许的.

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

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

鉴于这种情况,有效索引这些领域的建议方法是什么?该表是新的,因此现在还没有现有的数据需要担心,我们在表的实际实现中有相当大的灵活性.

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

  • 创建一个包含所有位字段的索引(这可能包括int总是使用的1或2个其他字段).我担心的是,鉴于仅包含一些字段的典型用法,此方法将跳过索引并采用表扫描.让我们称之为选项A(阅读了一些回复后,似乎这种方法效果不好,因为索引中字段的顺序会有所不同,因此无法在所有字段上有效地索引).
  • 有效地执行我认为SQL Server在内部执行的操作,并使用二元运算符将位字段编码为单个int字段(AND-ing和OR-ing一起使用:1,2,4,8等).我在这里担心的是我们需要进行某种计算来查询这个编码字段,这会再次跳过索引.此解决方案的维护和复杂性也是一个问题.让我们把这个选项B. 附加信息:该参数用于这种方法,我们可以有一个相对简单和短期指标,其中包括从表和本场的一个或两个字段.其他字段将缩小需要评估的记录数量,并且由于编码字段将包含所有位字段,因此SQL Server将能够使用从索引中直接检索的数据执行计算(即索引扫描) )而不是表(即表扫描).

目前,我们明显倾向于选择B.为了完整起见,这将在SQL Server 2008上运行.

任何建议将不胜感激.

编辑:拼写,清晰度,查询示例,选项B的其他信息.

sql sql-server indexing sql-server-2008

7
推荐指数
2
解决办法
1793
查看次数

为什么此If-AndAlso语句中的第二项要尽早评估?

为清楚起见,进行编辑:这是编译器的一个很奇怪的行为,我想问的是为什么它通常以这种方式表现,而不是如何解决(已经有几种简单的解决方案)。

最近,我遇到了一段代码,该代码引发了一个微妙的错误,并最终引发了异常。一个简短的,人为的示例:

Dim list As List(Of Integer) = Nothing
If list?.Any() AndAlso list.First() = 123 Then
    MessageBox.Show("OK then!")
End If
Run Code Online (Sandbox Code Playgroud)

在实际示例中,list只是偶尔出现Nothing,为了简化起见,我只是缩短了代码。If语句中第一项的用意是要检查列表是否不是Nothing,还要测试是否存在至少一个元素。由于在这种情况下listNothing,所以list?.Any()实际/通常求值为Nothing。有些违反直觉,第二项,即list.First() = 123同时运行时进行评估,从而导致一个明显的例外。这有点违反直觉,因为起初大多数人会认为这Nothing似乎是False,并且由于我们在AndAlso此处使用a ,因此短路运算符将阻止If执行语句的后半部分。

附加调查/“您尝试了什么:”

快速检查,以确认缩短If list?.Any() Then似乎对待list?.Any()False

Dim list As List(Of Integer) = Nothing

If list?.Any() Then
    MessageBox.Show("OK then!")   'This line doesn't get hit …
Run Code Online (Sandbox Code Playgroud)

vb.net

5
推荐指数
1
解决办法
101
查看次数

标签 统计

indexing ×1

sql ×1

sql-server ×1

sql-server-2008 ×1

vb.net ×1