协慌网

登录 贡献 社区

多个索引与多列索引

我一直在向 SQL Server 2005 中的表添加索引,这让我开始思考。创建 1 个索引和定义多个列而不是要索引的每列有 1 个索引之间有什么区别?

有某些原因为什么要使用另一种方法?

例如

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)

答案

我同意凯德 · 鲁(Cade Roux)的观点

本文应该使您走上正确的道路:

需要注意的一件事是,聚集索引应该在第一列中具有唯一键(我会推荐一个标识列)。基本上,它可以帮助您在索引末尾插入数据,而不会引起大量磁盘 IO 和页面拆分。

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

例如,假设您在三列中搜索一个表

州,县,邮编。

  • 您有时仅按州搜索。
  • 您有时会按州和县进行搜索。
  • 您经常按州,县,邮政编码搜索。

然后是带有州,县,邮政编码的索引。将在所有这三个搜索中使用。

如果您仅通过 zip 进行大量搜索,则上述索引将不会被使用(无论如何,SQL Server 都不会使用),因为 zip 是该索引的第三部分,并且查询优化程序不会认为该索引有帮助。

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

顺便说一下, 我们可以利用以下事实:使用多列索引时,第一个索引列始终可用于搜索,而仅按 “状态” 搜索时,它是有效的,但不如 “状态” 中的单列索引有效 '

我猜您正在寻找的答案是,这取决于您常用查询的 where 子句以及 group by 的。

这篇文章会有所帮助。 :-)

是的。我建议您查看Kimberly Tripp 的有关索引的文章

如果索引正在 “覆盖”,则除了索引外,无需使用其他任何内容。在 SQL Server 2005 中,您还可以将其他列添加到索引中,这些列不属于键,因此可以避免跳至行的其余部分。

具有多个索引,每个索引都在一个列上可能意味着只使用了一个索引 - 您将必须参考执行计划以查看不同索引方案所带来的影响。

您还可以使用调整向导来帮助确定哪些索引将使给定查询或工作负载表现最佳。

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

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

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