SQL聚簇索引与非聚簇索引的本质区别

数据库 SQL Server
下文就SQL聚簇索引与非聚簇索引的本质区别进行了分析讨论,供您参考,如果您对此方面有兴趣的话,不妨一看。

SQL聚簇索引的顺序就是数据的物理存储顺序,那么,SQL聚簇索引与非聚簇索引的本质区别,究竟在哪里呢?

现在讨论SQL聚簇索引与非聚簇索引的本质区别。正如本文最前面的两个图所示,聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。

还是通过一道数学题来看看它们的区别吧:假设有一8000条记录的表,表中每条记录在磁盘上占用1000字节,如果在一个10字节长的字段上建立非聚簇索引主键,需要二叉树节点16000个(这16000个节点中有8000个叶节点,每个页节点都指向一个数据记录),这样数据将占用8000条×1000字节/8K字节=1000个页面;索引将占用16000个节点×10字节/8K字节=20个页面,共计1020个页面。

同样一张表,如果我们在对应字段上建立SQL聚簇索引主键,由于SQL聚簇索引的页节点就是数据节点,所以索引节点仅有8000个,占用10个页面,数据仍然占有1000个页面。

下面我们看看在执行插入操作时,非聚簇索引的主键为什么比聚簇索引主键要快。主键约束要求主键不能出现重复,那么SQL Server是怎么知道不出现重复的呢?唯一的方法就是检索。对于非聚簇索引,只需要检索20个页面中的16000个节点就知道是否有重复,因为所有主键键值在这16000个索引节点中都包含了。但对于聚簇索引,索引节点仅仅包含了8000个中间节点,至于会不会出现重复必须检索另外1000个页数据节点才知道,那么相当于检索10+1000=1010个页面才知道是否有重复。所以聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。

让我们再来看看数据检索的效率,如果对上述两表进行检索,在使用索引的情况下(有些时候SQL Server执行计划会选择不使用索引,不过我们这里姑且假设一定使用索引),对于SQL聚簇索引检索,我们可能会访问10个索引页面外加1000个数据页面得到结果(实际情况要比这个好),而对于非聚簇索引,系统会从20个页面中找到符合条件的节点,再映射到1000个数据页面上(这也是最糟糕的情况),比较一下,一个访问了1010个页面而另一个访问了1020个页面,可见检索效率差异并不是很大。所以不管非聚簇索引也好还是聚簇索引也好,都适合排序,聚簇索引仅仅比非聚簇索引快一点。

 

 

【编辑推荐】

SQL注入语句五例

SQL SERVER事务的语法介绍

Sql Server视图的概念

使用SQL查询连续号码段的方法

SQL查询***最小值的示例

责任编辑:段燃 来源: 互联网
相关推荐

2010-07-14 15:04:53

SQL Sever索引

2023-06-12 08:38:23

聚簇索引排序非聚簇索引

2024-05-24 09:28:22

2022-06-13 07:36:06

MySQLInnoDB索引

2023-04-17 10:47:49

MySQL聚簇索引

2010-04-21 13:43:31

Oracle聚簇索引

2010-04-12 16:50:47

Oracle索引聚簇表

2010-04-12 17:00:37

Oracle索引聚簇表

2010-05-31 13:57:49

2023-06-05 08:07:34

聚集索引存储数据

2010-04-01 17:14:04

Oracle索引

2022-03-25 10:38:40

索引MySQL数据库

2024-03-25 13:02:00

MySQL索引主键

2020-02-14 18:10:40

MySQL索引数据库

2023-05-23 22:19:04

索引MySQL优化

2011-05-25 13:10:40

SQL ServerOracle

2023-04-26 07:40:34

MySQL索引类型存储

2021-07-02 09:45:29

MySQL InnoDB数据

2011-04-22 14:45:45

SQL索引

2022-05-26 07:31:42

索引SQL后端
点赞
收藏

51CTO技术栈公众号