位域是如何为索引排序的?

And*_*ber 4 index sql-server-2008 sql-server

我正在构建一个复合索引,但我不能 100% 确定以哪种方式包含作为bit表一部分的字段。该索引将用于类似于论坛主题列表的内容,我希望单个索引由ForumId(int), IsSticky(bit), then DatePosted (desc)(datetime2(0))

但我想确保IsSticky正确处理位域;我是否将其索引为trueis1-1?如果它是 1,我会索引 IsSticky 降序;如果-1,我会索引它升序。

另外,我要求使用 SQL 2008,但我很想知道它在 2005 年是否有所不同。

Mar*_*ith 18

一个SQL服务器位字段可以是0,1或NULL,所以我不能确定您的问题的一部分-1功能。

跳过这一点,论坛数据库中“粘性线程”的最合适解决方案是使用单独的过滤索引。将粘性线程标记为IsSticky=1并按照以下方式创建过滤索引:

CREATE NONCLUSTERED INDEX IX_Posts_StickyThread
    ON dbo.Posts (ForumId, PostId)
WHERE IsSticky = 1;
Run Code Online (Sandbox Code Playgroud)

过滤索引是 SQL2008 的新功能,因此这不是 SQL2005 的选项。SQLCat 文章Using a Low-Selectivity BIT Column First Can Be the Best Strategy将适用于 2005 年对此方法的阅读(编辑:文章已存档到电子书SQLCAT 的关系引擎指南)。

并且只是为了解决索引中的标题问题位字段的排序与每个 ORDER BY bit_field 相同,即 NULL, 0, 1 (信用 @MartinSmith)。

  • 是和否。当然,在这种情况下您只节省了几个字节,性能优势很难与常规的非过滤索引区分开来。然而,将情况转换为 StackOverflow 规模的东西,这种好处可能很重要。功能就在那里,不妨利用它。 (4认同)
  • @Shark - 过滤索引也可以快得多。如果引擎识别出过滤器与查询中的过滤器匹配,则跳过评估。 (2认同)