SQL server中的非聚集索引使用

SQL server中的非聚集索引使用,sql,sql-server,Sql,Sql Server,谁能告诉我在SQL server中使用非聚集索引有什么用。 据我所知,聚集索引和非聚集索引都使搜索变得容易。一个用途是一个表上只能有一个聚集索引。如果需要多个索引,其余的必须是非聚集索引。聚集索引是表中每一行的数据物理存储在磁盘上的方式(每个表只能有一种索引类型),因此所有写操作的性能都基于此索引。如果你必须重建这个索引或者在这个索引上移动东西,这可能会非常昂贵 非聚集索引只是行的特定部分的列表,其顺序与它们的物理存储方式不同(每个表可以有多个索引类型),并且是指向实际存储位置的指针。当您只知道

谁能告诉我在SQL server中使用非聚集索引有什么用。
据我所知,聚集索引和非聚集索引都使搜索变得容易。

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

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

非聚集索引只是行的特定部分的列表,其顺序与它们的物理存储方式不同(每个表可以有多个索引类型),并且是指向实际存储位置的指针。当您只知道某一行的某些信息时,使用非聚集索引可以方便地查找该行

如果将一本典型的教科书视为一个数据库表,则聚集索引是该书实际内容页面的集合。因为从逻辑上讲,按这个顺序写这些页面是有意义的。 非聚集索引是书后面的索引,按字母顺序列出了重要的术语。这只是列出了你要找的单词,以及你能找到的页码。当你在寻找一个特定的术语时,这使得你很容易找到你需要阅读的内容

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


使用某些列搜索数据时,通常使用非聚集索引。因此,如果您有一个满是人的表,并且您通常按姓氏查找人,那么您可能希望在“姓氏”列上的“人”表上有一个非聚集索引。或者你可以在姓、名上加一个。如果您也通常根据年龄搜索人员,那么您可能希望在人员的“生日”列上有另一个非聚集索引。这样你就可以很容易地搜索出生日期在某个日期以上或以下的人。

解释这种差异的经典例子是一本电话簿。电话簿,从开始到结束按姓氏的物理结构(我想,我已经有一段时间没有看物理电话簿了),类似于表上的聚集索引。一个表上只能有一个聚集索引。事实上,聚集索引就是表;这是它在磁盘上物理存储的方式。聚集索引的结构包含您定义的键,以及所有数据。另请注意,在SQL中,您根本不必拥有聚集索引;这样的表被称为“堆”,但这很少是个好主意

例如,如果您想按地址查找电话簿中某人的条目,则可以使用非聚集索引。在电话簿的后面会有一个索引,地址按字母顺序排列,然后在电话簿的什么地方可以找到那个电话号码。这样做被称为“查找”。因此,非聚集索引具有:

  • 要索引的键(例如地址)
  • 指向聚集索引中的行的指针(该地址的人的姓氏)
  • (可选)您可能经常需要但不想返回聚集索引进行查找的包含列的列表
聚集索引包含每行的所有数据,而非聚集索引通常较小,因为您只有键、指针和可选包含的列。你也可以拥有你想要的数量


就它们返回数据的方式而言,它们非常相似,特别是当您不必查找聚集索引时。可以从非聚集索引中获取所需一切的查询称为“覆盖”(即非聚集索引覆盖了所需的所有内容)。此外,由于聚集索引是物理数据的线性排序,它使基于范围的查询更快,因为它只需使用聚集索引起点的偏移量即可找到范围的起点和终点。

其他索引似乎都触及了相同的点,不过,我会尽量简短,并为您提供一个资源,以获取更多有关这方面的信息

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

请查看世界级DBA Brent Ozar的免费视频:


祝你好运

谢谢你的时间:)谢谢你的时间:)谢谢你的时间:)