我已经有点知道这个问题的答案了,但我总觉得我需要更多地了解这个话题。
我的基本理解是,一般来说,仅包含您可能在任何给定时间查询/排序的所有字段的单个索引不太可能有用,但我已经看到了这种类型的事情。就像有人想的那样,“好吧,如果我们把所有这些东西都放在一个索引中,数据库就可以使用它来找到它需要的东西”,而从未见过一些正在运行的实际查询的执行计划。
想象一个像这样的表:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Run Code Online (Sandbox Code Playgroud)
我可能会看到一个包含name,customerId和dateCreated字段的索引。
但我的理解是这样的索引不会在查询中使用,例如:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Run Code Online (Sandbox Code Playgroud)
对于这样的查询,在我看来,更好的主意是包含customerId和dateCreated字段的索引,该customerId字段是“第一”。这将创建一个索引,该索引将以这样一种方式组织数据,以便该查询可以快速找到它需要的内容 - 按照它需要的顺序。
我看到的另一件事,也许和第一件事一样频繁,是每个字段的单独索引;所以,每一个上name,customerId和dateCreated领域。
与第一个例子不同,这种安排在我看来有时至少是部分有用的。查询的执行计划可能会显示至少它使用 上的索引customerId来选择记录,但它没有使用带有dateCreated字段的索引对它们进行排序。
我知道这是一个广泛的问题,因为对任何特定表集的任何特定查询的具体答案通常是查看执行计划所说的它将要做什么,否则将表和查询的细节纳入帐户。另外,我知道这取决于查询的运行频率,而不是为其维护特定索引的开销。
但我想我要问的是作为索引的一般“起点”,为特定的、经常提取的查询和 WHERE 或 ORDER BY 子句中的字段设置特定索引的想法有意义吗?
我正在构建一个复合索引,但我不能 100% 确定以哪种方式包含作为bit表一部分的字段。该索引将用于类似于论坛主题列表的内容,我希望单个索引由ForumId(int), IsSticky(bit), then DatePosted (desc)(datetime2(0))
但我想确保IsSticky正确处理位域;我是否将其索引为trueis1或-1?如果它是 1,我会索引 IsSticky 降序;如果-1,我会索引它升序。
另外,我要求使用 SQL 2008,但我很想知道它在 2005 年是否有所不同。