SQL Server中的非聚集索引使用

5

有人能告诉我 SQL Server 中非聚集索引的用途是什么吗?据我所知,聚集索引和非聚集索引都可以使搜索变得更容易。

4个回答

2

一个用途是在表上只能有一个聚集索引。如果你需要多于一个,则其余的必须是非聚集索引。


1
经典的例子来解释二者之间的区别是电话簿。电话簿从头到尾按姓氏(我认为,自从我看过实物电话簿以来已经很久了)的物理结构类似于表上的聚集索引。在一个表上只能有一个聚集索引。事实上,聚集索引就是表;它是如何在磁盘上物理存储的。聚集索引的结构包含您定义的键以及所有数据。顺便说一句,在SQL中,您不必拥有聚集索引;这样的表称为“堆”,但这很少是一个好主意。
举个例子,非聚集索引可以是如果您想通过地址查找电话簿中某人的条目。您将在电话簿的后面具有按字母顺序排序的地址索引,然后可以在电话簿中找到该电话号码。这样做被称为“查找”。因此,非聚集索引具有:
- 您要索引的键(例如地址) - 回指到聚集索引中的行的指针(该地址处的人的姓氏) - 可选的包含您可能经常需要但不想返回聚集索引查找的列列表。

聚集索引包含每一行的所有数据,而非聚集索引通常较小,因为您只有键、指针和可选的包含列。您也可以拥有任意多个非聚集索引。

就它们返回数据的方式而言,它们非常相似,特别是如果您从未必须在聚集索引上执行查找操作。能够从非聚集索引中获取所需内容的查询被称为“覆盖”(即所有所需内容都由非聚集索引覆盖)。此外,由于聚集索引是物理数据的线性排序,因此基于范围的查询更快,因为它可以通过使用从聚集索引开始的偏移量来找到范围的起点和终点。


1
其他人似乎都涉及了相同的要点,但我会简短地提供一个资源供您获取更多信息。聚集索引是表格,它(显然)包括所有列。当结果集中有许多数据行时,这可能并不总是所需的,并且可能会成为阻碍。您可以利用非聚集索引(实际上是表格的一部分副本)来“覆盖”查询,以便您可以获得更快的响应时间。请查看这个来自世界级DBA Brent Ozar的免费视频: https://www.brentozar.com/training/think-like-sql-server-engine/ 祝你好运!

0

聚集索引是指每个表的每一行数据在磁盘上的物理存储方式(每个表只能有一个此类型的索引),因此所有写操作的性能都基于该索引。如果您必须重建此索引或在此索引上移动内容,则可能非常昂贵。

非聚集索引仅是按不同顺序列出行的特定部分(每个表可以有多个此类型的索引),并指向其实际存储位置的指针。非聚集索引用于在您只知道某些行信息时轻松查找特定行。

如果您将传统教科书视为数据库表,则聚集索引是该书实际内容页的集合,因为按照逻辑顺序编写这些页面是有意义的。非聚集索引是书后索引,按字母顺序列出重要术语。它仅列出您要查找的单词和页码,使您在查找特定术语时可以轻松找到需要阅读的内容。

通常,将聚集索引设置为遵循NUSE原则(窄、唯一、静态、递增)的ID是一个好主意。通常情况下,您可以使用SMALLINT、INT或BIGINT来实现这一点,具体取决于您想在表中存储的数据量。这样可以给您一个窄键,因为它们只有2、4或8个字节宽(分别),您还可能希望为该列设置IDENTITY属性,以便自动递增。如果您从不更改此行的值(使其静态)--通常没有理由这样做--那么它将是唯一的和递增的。这样,当您插入新行时,它只会将其放在磁盘上的下一个可用位置。这可以提高写入速度。
非聚集索引通常用于使用某些列搜索数据的情况。因此,如果您有一个充满人员信息的表,并且通常按姓氏查找人员,则可能需要在人员表上的姓氏列上设置非聚集索引。或者您可以在姓和名之间设置一个非聚集索引。如果您还经常根据年龄搜索人员,则可能需要在人员的出生日期列上设置另一个非聚集索引。这样,您就可以轻松地搜索出生日期在某个日期之上或之下的人员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接