java中簇如何表示_聚簇索引和非聚簇索引实际上是什么意思?

 2023-09-17 阅读 20 评论 0

摘要:我对DB的接触有限,只使用DB作为应用程序程序员。 我想了解Clustered和Non clustered indexes 。 我搜索了一下,发现的是:聚集索引是一种特殊的索引,它重新排序表中记录的物理存储方式。 因此,表只能有一个聚集索引。 聚集索引的叶节点包含

我对DB的接触有限,只使用DB作为应用程序程序员。 我想了解Clustered和Non clustered indexes 。 我搜索了一下,发现的是:

聚集索引是一种特殊的索引,它重新排序表中记录的物理存储方式。 因此,表只能有一个聚集索引。 聚集索引的叶节点包含数据页。 非聚集索引是一种特殊类型的索引,其中索引的逻辑顺序与磁盘上行的物理存储顺序不匹配。 非聚集索引的叶节点不包含数据页。 相反,叶节点包含索引行。

有人可以用简单的英语解释吗?

#1楼

唯一索引和聚簇索引的区别,聚集索引意味着您要告诉数据库在磁盘上存储实际上彼此接近的关闭值。 这具有快速扫描/检索落入聚集索引值范围内的记录的好处。

例如,您有两个表Customer和Order:

Customer

----------

ID

java关键字有哪些、Name

Address

Order

----------

ID

java数组的定义、CustomerID

Price

如果希望快速检索一个特定客户的所有订单,则可能希望在“订单”表的“客户ID”列上创建聚簇索引。 这样,具有相同CustomerID的记录将在物理上彼此靠近存储在磁盘上(成簇),从而加快了检索速度。

PS客户ID上的索引显然不是唯一的,因此您要么需要添加第二个字段来“统一”索引,要么让数据库为您处理该索引,但这是另一回事了。

关于多个索引。 每个表只能有一个聚集索引,因为它定义了数据的物理排列方式。 如果您想打个比方,请想象一个有很多桌子的大房间。 您可以将这些表形成几行,也可以将它们全部拉在一起以形成一个大会议表,但不能同时使用两种方法。 一个表可以有其他索引,它们将指向聚集索引中的条目,而聚集索引又将最终说出在哪里可以找到实际数据。

java tostring方法。#2楼

使用聚集索引时,行将以与索引相同的顺序物理存储在磁盘上。 因此,只能有一个聚簇索引。

使用非聚集索引时,第二个列表具有指向物理行的指针。 您可以有许多非聚集索引,尽管每个新索引都会增加写入新记录所需的时间。

如果要取回所有列,通常从聚集索引中读取会更快。 您不必先进入索引,然后再进入表。

如果需要重新排列数据,则写入具有聚集索引的表的速度可能会变慢。

数据库聚簇索引和非聚簇索引、#3楼

一个非常简单的,非技术性的经验法则是,聚集索引通常用于主键(或至少是唯一列),而非聚集索引用于其他情况(也许是外键) 。 实际上,默认情况下,SQL Server将在您的主键列上创建聚簇索引。 正如您将学到的,聚集索引与磁盘上数据的物理排序方式有关,这意味着在大多数情况下,它是一个很好的全面选择。

#4楼

在下面找到聚集索引和非聚集索引的一些特征:

聚集索引

java 常量?聚集索引是唯一标识SQL表中行的索引。

每个表可以只有一个聚集索引。

您可以创建涵盖多个列的聚集索引。 例如: create Index index_name(col1, col2, col.....) 。

默认情况下,具有主键的列已具有聚集索引。

非聚集索引

java lambda、非聚集索引就像简单索引。 它们仅用于快速检索数据。 不确定是否具有唯一数据。

#5楼

在SQL Server面向行的存储中,聚集索引和非聚集索引都组织为B树。

QF8d7.gif

聚集索引和非聚集索引之间的主要区别在于,聚集索引的叶级是表。 这有两个含义。

聚集索引叶子页上的行始终为表中的每个(非稀疏)列包含某些内容 (值或指向实际值的指针)。

java.awt。聚集索引是表的主副本。

非聚集索引也可以通过使用INCLUDE子句(自SQL Server 2005开始)明确包含所有非键列来进行第1点的操作,但是它们是辅助表示,并且周围始终有另一个数据副本(表本身)。

CREATE TABLE T

(

A INT,

java匿名内部类?B INT,

C INT,

D INT

)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)

java循环结构?CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

上面的两个索引几乎相同。 上级索引页面包含键列A,B值,叶级页面包含A,B,C,D

每个表只能有一个聚集索引,因为数据行本身只能以一种顺序排序。

上面SQL Server在线丛书中的引用引起很多混乱

我认为最好用这样的措辞。

ArrayList和LinkedList的区别。每个表只能有一个聚集索引,因为聚集索引的叶级行是表行。

联机丛书的报价并不正确,但是您应该清楚非聚集索引和聚集索引的“排序”是逻辑上而非物理上的。 如果您通过遵循链接列表来读取叶级页面,并以插槽数组顺序读取页面上的行,则您将以排序的顺序读取索引行,但实际上页面可能未排序。 通常认为,使用聚集索引时,行总是以与索引键相同的顺序物理存储在磁盘上,这是错误的。

这将是荒谬的实现。 例如,如果某行插入到4GB桌子中间的SQL Server 没有在文件中的数据拷贝2GB高达腾出空间给新插入的行。

而是发生页面拆分。 聚簇索引和非聚簇索引的叶级上的每个页面都有按逻辑键顺序排列的下一页和上一页的地址( File:Page )。 这些页面不必是连续的或按键顺序排列的。

例如,链接的页面链可能是1:2000 1:157 1:7053

innodb聚簇索引和非聚簇索引、当发生页面拆分时,将从文件组中的任何位置分配新页面(从混合范围(对于小型表),或者属于该对象的非空统一范围或新分配的统一范围)。 如果文件组包含多个文件,则该文件甚至可能不在同一文件中。

逻辑顺序和连续性与理想物理版本不同的程度是逻辑碎片的程度。

在一个只有一个文件的新创建的数据库中,我运行了以下命令。

CREATE TABLE T

(

X TINYINT NOT NULL,

Y CHAR(3000) NULL

);

CREATE CLUSTERED INDEX ix

ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order

DECLARE @C1 AS CURSOR,

@X AS INT

SET @C1 = CURSOR FAST_FORWARD

FOR SELECT number

FROM master..spt_values

WHERE type = 'P'

AND number BETWEEN 1 AND 100

ORDER BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO T (X)

VALUES (@X);

FETCH NEXT FROM @C1 INTO @X;

END

然后使用

SELECT page_id,

X,

geometry::Point(page_id, X, 0).STBuffer(1)

FROM T

CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )

ORDER BY page_id

结果到处都是。 按键顺序的第一行(值1-用下面的箭头突出显示)几乎在最后一个物理页面上。

OL6eY.png

通过重建或重新组织索引以增加逻辑顺序和物理顺序之间的相关性,可以减少或消除碎片。

跑步后

ALTER INDEX ix ON T REBUILD;

我得到以下

ETaJd.png

如果表没有聚簇索引,则称为堆。

非聚集索引可以建立在堆索引或聚集索引上。 它们始终包含返回到基表的行定位器。 对于堆,这是物理行标识符(rid),由三个组件(File:Page:Slot)组成。 对于聚簇索引,行定位符是逻辑的(聚簇索引键)。

对于后一种情况,如果非聚簇索引已经自然地包括CI键列(作为NCI键列或INCLUDE -d列),则不添加任何内容。 否则,缺少的CI键列将被静默添加到NCI中。

SQL Server始终确保两种索引类型的键列都是唯一的。 但是,对于未声明为唯一的索引,强制执行此机制的机制在两种索引类型之间有所不同。

聚簇索引会为具有重复现有行的键值的任何行添加一个uniquifier 。 这只是一个递增的整数。

对于未声明为唯一的非聚集索引,SQL Server会将行定位符静默添加到非聚集索引键中。 这适用于所有行,而不仅仅是实际重复的行。

聚类命名法与非聚类命名法也用于列存储索引。 本文对SQL Server列存储的增强状态

尽管列存储数据并没有真正“聚集”在任何键上,但我们还是决定保留传统的SQL Server约定,即将主索引称为聚簇索引。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/72279.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息