我们目前有一个场景,其中一个表实际上有几个(10到15)布尔标志(不是可空bit字段).不幸的是,在逻辑层面上实际上不太可能简化这一点,因为布尔值的任何组合都是允许的.
有问题的表是一个事务表,最终可能有数千万行,插入和选择性能都非常关键.虽然我们目前还不太确定数据的分布,但是所有标志的组合应该提供相对良好的基数,即使其成为SQL Server使用的"有价值"索引.
典型的选择查询场景可能是仅基于3或4个标志来选择记录,例如WHERE FLAG3=1 AND FLAG7=0 AND FLAG9=1.为这些选择查询使用的所有标志组合创建单独的索引是不切实际的,因为它们中有很多.
鉴于这种情况,有效索引这些领域的建议方法是什么?该表是新的,因此现在还没有现有的数据需要担心,我们在表的实际实现中有相当大的灵活性.
目前我们正在考虑两个主要选项:
int总是使用的1或2个其他字段).我担心的是,鉴于仅包含一些字段的典型用法,此方法将跳过索引并采用表扫描.让我们称之为选项A(阅读了一些回复后,似乎这种方法效果不好,因为索引中字段的顺序会有所不同,因此无法在所有字段上有效地索引).目前,我们明显倾向于选择B.为了完整起见,这将在SQL Server 2008上运行.
任何建议将不胜感激.
编辑:拼写,清晰度,查询示例,选项B的其他信息.
为清楚起见,进行编辑:这是编译器的一个很奇怪的行为,我想问的是为什么它通常以这种方式表现,而不是如何解决(已经有几种简单的解决方案)。
最近,我遇到了一段代码,该代码引发了一个微妙的错误,并最终引发了异常。一个简短的,人为的示例:
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,还要测试是否存在至少一个元素。由于在这种情况下list为Nothing,所以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)