多个索引与多列索引

跨多个列创建一个索引与创建多个索引,一个列之间有什么区别?

有没有理由为什么一个应该使用另一个?

例如:

Create NonClustered Index IX_IndexName On TableName(Column1 Asc, Column2 Asc, Column3 Asc)

对战:

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)
387441 次浏览

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

如果索引是“覆盖”,则不需要使用索引以外的任何内容。在SQLServer 2005中,您还可以向索引添加不属于键的其他列,这可以消除对行其余部分的访问。

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

您还可以使用优化向导来帮助确定哪些索引将使给定查询或工作负载执行最佳。

如果您的查询经常使用一组相对静态的列,那么创建一个包含所有列的覆盖索引将显着提高性能。

通过在索引中放置多列,优化器只有在列不在索引中时才必须直接访问表。我在数据仓库中经常使用这些。缺点是这样做会花费大量开销,尤其是在数据非常不稳定的情况下。

在单个列上创建索引对于联机事务处理系统中常见的查找操作很有用。

您应该问问自己为什么要索引列以及它们将如何使用。运行一些查询计划并查看何时访问它们。索引调优既是本能也是科学。

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

SELECT *FROM TableNameWHERE Column1=1 AND Column2=2 AND Column3=3

这可以直接使用多列索引进行查找。另一方面,最多可以使用单列索引中的一个(它必须查找所有具有Columbia n1=1的记录,然后在每个记录中检查列2和列3)。

我同意CadeRoux

这篇文章应该让你走上正轨:

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

其次,如果您在数据上创建其他索引,并且它们的构造巧妙,它们将被重用。

假设你在三列上搜索一个表

州,县,邮编。

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

然后,州,县,zip的索引。将在所有这三个搜索中使用。

如果您只使用zip进行搜索,则不会使用上述索引(无论如何SQLServer),因为zip是该索引的第三部分,查询优化器不会认为该索引有帮助。

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

顺便说一下我们可以利用这样一个事实,即在多列索引中,第一个索引列总是可用于搜索,当你只搜索“状态”时,它是有效的,但不如“状态”上的单列索引有效

我猜你要找的答案是,这取决于你经常使用的查询的where子句和你的group by。

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

似乎遗漏了一项是星型转换。索引交叉点 运算符通过在事实表上完成任何I/O之前计算每个谓词命中的行集来解析谓词。在星型模式上,你将索引每个单独的维度键,查询优化器可以通过索引交集计算来解析要选择哪些行。单个列上的索引为此提供了最佳的灵活性。