多个索引与多列索引

Gat*_*ler 611 database sql-server indexing

我刚刚在SQL Server 2005中的表中添加了一个索引,它让我思考.创建1个索引和定义多个列之间的区别在于每个列要索引1个索引.

是否有某些原因应该用于另一个?

例如

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)
Run Code Online (Sandbox Code Playgroud)

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)
Run Code Online (Sandbox Code Playgroud)

evi*_*mer 301

我同意Cade Roux.

本文应该让您走上正轨:

有一点需要注意,聚簇索引应该有一个唯一的键(我建议使用的标识列)作为第一列.基本上它可以帮助您在索引末尾插入数据,而不会导致大量磁盘IO和页面拆分.

其次,如果您正在为数据创建其他索引并且它们被巧妙地构造,则它们将被重用.

例如,想象你在三列上搜索一个表

州,县,邮编.

  • 你有时只按国家搜索.
  • 你有时会按州和县搜索.
  • 你经常按州,县,邮编搜索.

然后是一个带有州,县,拉链的索引.将用于所有这三个搜索.

如果您通过zip单独搜索,那么上面的索引将不会被使用(无论如何由SQL Server),因为zip是该索引的第三部分,并且查询优化器将不会看到该索引有用.

然后,您可以在Zip上创建一个索引,该索引将在此实例中使用.

我想您正在寻找的答案取决于您经常使用的查询的where子句以及您的组.

这篇文章会有很多帮助.:-)

  • @jball我在这里错过了什么吗?看起来这篇文章主要是关于SQL Server版本限制之间的差异.文章可能被移动了吗? (11认同)
  • 1)“基本上[以IDENTITY列作为第一列的聚集索引]可以帮助您在索引末尾插入数据”是正确的。在多用户系统中,“不会导致大量磁盘 IO 和页面拆分”是完全错误的。事实是,它**保证**多用户系统中的高争用(低并发)。2)聚集索引应该是一个关系键,即。*不是*“身份、GUID 等”。3) “然后,包含州、县、邮政编码的索引将用于所有这三个搜索。” 是假的,并且与“第一列可用”相矛盾。索引中的第二列和子列不可用于搜索。 (4认同)
  • 那么,除了为每列设置单独的索引之外,最好的办法是为州,县和邮政编码定义一个索引吗? (2认同)

Cad*_*oux 73

是.我建议你查看Kimberly Tripp关于索引的文章.

如果索引是"覆盖",那么除了索引之外不需要使用任何东西.在SQL Server 2005中,您还可以向索引添加其他列,这些列不是键的一部分,可以消除到行的其余部分的行程.

拥有多个索引,每个索引在一个列上可能意味着只使用一个索引 - 您必须参考执行计划以查看不同索引方案提供的效果.

您还可以使用调整向导来帮助确定哪些索引可以使给定查询或工作负载的性能最佳.

  • 金伯利·特里普知道她在说什么.我正在谈论她,她知道这些东西.很棒的建议. (5认同)
  • @CadeRoux如果大多数时候我的where子句在“&”关系中有两列,那么对它们使用多列索引还是对它们都使用单列索引会更好吗 (2认同)
  • @RachitGupta包含两列的一个索引 (2认同)

Mob*_*yDX 40

多列索引可用于引用所有列的查询:

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3
Run Code Online (Sandbox Code Playgroud)

可以使用多列索引直接查找.另一方面,最多可以使用一个单列索引(它必须查找具有Column1 = 1的所有记录,然后检查每个列中的Column2和Column3).

  • 这是对的.但是,将这些列作为单个索引,每个列仍然可以大大加快速度.通常,列中的一个值会减少结果集,以至于在没有索引的情况下查找其余值并不重要,优化器擅长选择此值. (24认同)
  • @Embedded_Mugs 我认为是这样的。第一个索引混淆了返回的行的顺序,并且您无法对这些行使用进一步的索引。 (2认同)

Con*_*lls 17

似乎已经错过的一个项目是星变换. 索引交集运算符通过在事实表上完成任何I/O之前计算每个谓词命中的行集来解析谓词.在星型模式中,您将索引每个单独的维度键,查询优化器可以解析索引交集计算要选择的行.各列的索引为此提供了最大的灵活性.


Bob*_*bst 8

如果您的查询经常使用相对静态的列集,那么创建包含它们的单个覆盖索引将大大提高性能.

通过在索引中放置多个列,如果列不在索引中,优化器将只需要直接访问该表.我在数据仓库中经常使用这些.缺点是这样做会花费很多开销,特别是如果数据非常不稳定.

在单个列上创建索引对于OLTP系统中常见的查找操作很有用.

您应该问问自己为什么要为列编制索引以及如何使用它们.运行一些查询计划,看看它们何时被访问.指数调整与科学一样本能.