SQL服务器中使用非聚集索引

时间:2017-07-13 18:57:08

标签: sql sql-server

任何人都可以告诉我在SQL Server中使用非聚集索引有什么用处。 据我所知,聚簇和非聚簇索引使搜索变得容易..

4 个答案:

答案 0 :(得分:1)

一个用途是您只能在表上拥有一个聚簇索引。如果您想要多个,则其余部分必须是非群集的。

答案 1 :(得分:0)

聚簇索引是表的每一行的数据如何物理存储在磁盘上(每个表只能有一种这样的索引类型),因此所有的写操作都是'性能基于此指数。如果你必须重建这个索引或者在这个索引上移动东西,这可能会非常昂贵。

非聚簇索引只是行的特定部分的列表,其顺序与它们的物理存储顺序不同(每个表可以有多个这些索引类型),以及指向实际存储位置的指针。非聚集索引用于在您只知道有关该行的某些信息时轻松找到特定行。

如果您将典型的教科书视为数据库表,则聚簇索引是该书的实际内容页面集。因为从逻辑上讲,按顺序编写这些页面是有意义的。  非聚集索引是本书后面的索引,按字母顺序列出重要术语。这只列出您要查找的单词,以及您可以找到它的页码。这样,当您查找特定术语时,您可以轻松找到需要阅读的内容。

通常,最好使聚簇索引成为遵循NUSE原则的ID(窄,唯一,静态,不断增加)。通常,您可以使用SMALLINT,INT或BIGINT来完成此操作,具体取决于您要在表中存储的数据量。这为您提供了一个窄键,因为它们只有2个,4个或8个字节宽(分别),您可能还希望为该列设置IDENTITY属性,使其自动递增。如果你永远不改变一行的这个值(使它静止) - 并且通常没有理由这样做 - 那么它将是独一无二的并且不断增加。这样,当您插入新行时,它只会将其抛出到磁盘上的下一个可用位置。这有助于提高写入速度。

当您使用某些列搜索数据时,通常会使用非聚簇索引。因此,如果您有一个满桌的人,并且您通常按姓氏查找人员,那么您可能希望在姓氏列上的人员表上使用非聚集索引。或者你可以有一个姓氏,名字。如果您通常也会根据其年龄搜索人员,那么您可能希望在人员的生日列中使用另一个非聚集索引。这样,您就可以轻松搜索在特定日期之上或之下出生的人。

答案 2 :(得分:0)

解释差异的经典例子是电话簿之一。电话簿,从姓名开头到结尾的物理结构(我认为,自从我查看实体电话簿以来已经有一段时间了)类似于桌面上的聚集索引。表上只能有一个聚簇索引。实际上,聚集索引是表;它是如何物理存储在磁盘上的。聚簇索引的结构包含您定义的键以及所有数据。注意,在SQL中,您根本不需要拥有聚簇索引;这样的表被称为“堆”,但这不是一个好主意。

例如,如果你想通过地址在电话簿中查找某人的条目,那么非聚集索引就是这样。你在书的后面有一个索引,地址按字母顺序排序,然后在电话簿中你可以找到那个电话号码。这样做称为“查找”。所以非聚集索引有:

  • 您要编制索引的键(例如地址)
  • 指向聚集索引中的行的指针(该地址的人的姓氏)
  • (可选)您可能经常需要的列表列表,但不想返回聚簇索引进行查找。

虽然聚簇索引包含每行的所有数据,但非聚簇索引通常较小,因为您只有键,指针和可选的列。你也可以随心所欲地拥有它们。

就他们如何返回数据而言,它们非常相似,特别是如果您永远不必查找聚簇索引。一个可以从非聚集索引中获取所需内容的查询被称为“覆盖”(因为所有你需要的东西都被非聚集索引覆盖)。此外,由于聚簇索引是物理数据的线性排序,因此它可以使基于范围的查询更快,因为它只需使用聚簇索引开头的偏移量就可以找到范围的开始和结束。

答案 3 :(得分:0)

其他人似乎都触及了相同的观点,尽管我会保持简短并为您提供资源以获取更多相关信息。

聚簇索引表,它(显然)包括所有列。这可能并不总是需要的,并且当结果集中有许多行数据时可能成为障碍。您可以使用非聚集索引(实际上是表的一部分的副本)来覆盖"覆盖"您的查询,以便您可以更快地获得响应时间。

请查看世界级DBA,Brent Ozar的免费视频:https://www.brentozar.com/training/think-like-sql-server-engine/

祝你好运!

相关问题