第6/24周 聚集索引

上个星期我向你介绍了堆表(heap tables)。我们说过,在SQL Server表可以是堆表(Heap Table)或者聚集表(Clustered Table)——一个在它上面有聚集索引(Clustered Index)定义的表。今天我们来谈论聚集索引(Clustered Index)的更多细节,还有如何选择正确的聚集键(Clustered Key)。

每次你在SQL Server创建一个主键约束(Primary Key constraint),这个约束(默认情况)是通过唯一聚集索引(Unique Clustered Index)来执行的。这意味着你选择的那列(或多列,当你定义复合主键(composite primary key)时)必须是唯一值。作为一种副作用,你的表数据是按那列(或那些列)物理排序的。让我们一起看下在SQL Server里聚集索引(Clustered Index)的优点和缺点。

优点

聚集表最大的优点是,数据是在你的存储子系统里是按聚集键(Clustered Key)物理排序的。你可以拿传统电话本与聚集表(Clustered Table)做比较:电话本是按姓来聚合排序的,这意味着Aschenbrenner排在Bauer之前,Bauer排在Meyer之前。因此聚集表(Clustered Table)和堆表(heap tables)完全不一样,堆表没有物理上的排序顺序。

你可以从聚集表(Clustered Table)获得真正的巨大受益。想象下你在便利查找一条具体的记录,在WHERE语句里那列是你用来限制你数据的主键(Clustered Key)。在那个情况下,SQL Server在执行计划里会选择聚集索引(Clustered Index Seek)查找运算符。查找运算符会非常,非常高效,因为SQL Server使用B-tree结构来找相关的数据。这个查找运算符的复杂度总是O(log N)。如果你想学习更多关于B+tree在内部是如何使用的,你可以观看我关于这个话题的SQL Server Quickie。在过去的2010年里,我也写了关于这个话题的很多博客帖子。

当你在电话本找名为Aschenbrenner的号码是一样的,你知道那个名只能在电话本的开头部分找到,因为电话本是按这个数据(名)排序的。因此你可以避免整个电话本的扫描,而SQL Server可以避免在叶子节点聚集索引(Clustered Index)的完全扫描。

只要在你的聚集索引(Clustered Index)里没有索引碎片(index fragmentation),当你使用扫描运算符访问聚集索引时,你会使用循序存取(sqquential I/O)。索引碎片(index fragmentation)指的是你在叶节点里的页,逻辑上和物理上的排列顺序是不一样的。你可以通过Index RebuildIndex Reorganized操作来修复索引碎片(index fragmentation)。在第24周,当我们涉及数据库维护时,我们会谈到这2个操作间的区别。

是否有索引碎片取决于你选择的聚集键(Clustered Key)列。只要你使用自增长值(像 INT IDENTIY,或订单日期(OrderDate)列),记录插在聚集索引(Clustered Index)的末端。这意味着在你索引里,碎片不会被引入。因为SQL Server只在你聚集索引(Clustered Index)末端追加数据。但在一些极少的情况下,也会产生索引碎片(index fragmentation)。因此我们现在会谈到聚集索引(Clustered Index)拥有的缺点,还有聚集键(Clustered Key)的错误选择。

缺点

数据只插在聚集索引(Clustered Index)的末端会引入被称为最后页插入加锁竞争(Last Page Insert Latch Contention)的问题,因为在你的聚集索引(Clustered Index)的末端你只有一个热区(hotspot),那里各个查询在遍历(traversing through)B-tree结构时互相竞争。下图演示了这个现象。

Last Page Insert

 

为了克服这个问题,你可以选择随机聚集键(random Clustered Key)作为你的聚集索引(Clustered Index),那样的话,你就可以把插入的数据散步到聚集索引(Clustered Index)里各个不同地方。但是随机聚集键(random Clustered Key)会引入被称为硬页分裂(Hard Page Splits)的问题,因为SQL Server需要把新数据页分配到在聚集索引(Clustered Index)叶子级别之内的一些地方。硬页分裂(Hard Page Splits)同样也有在事务日志(transaction log)性能上的负面影响,因为相比在你聚集索引(Clustered Index)末端记录一个普通的INSERT(被称为软页分裂(Soft Page Splits)),记录一个硬页分裂(Hard Page Splits)需要更多的工作。

作为一个副作用,随机聚集键(random Clustered Key)会引入索引碎片(index fragementation),因为你的逻辑和物理排列顺序已经不再一样。随机存取(random I/O) 会扼杀你在传统的旋转存储的扫描操作性能,因为当读取各个数据页的时候,磁头必须在硬盘的盘片上前后移动。

小结

聚集索引(Clustered Index)伸缩性(scale)很好,因为它内部采用了B-tree数据结构。当在你表进行索引查找(index seek)运算符时,SQL Server可以很高效的利用这个结构。但是选择一个正确并合适的聚集键(Clustered Key)是个很耗时的工作,因为你要考虑每个情况下所有优点和缺点(什么时候用增值型(increasing value),什么时候用随机值型(random value))。

了解聚集索引的更多细节信息,可以看下索引深入浅出:聚集索引的B树结构。

下星期我会谈论SQL Server里非聚集索引(Non-Clustered Indexes)的更多信息。你会学到什么是非聚集索引(Non-Clustered Indexes),还在聚集索引(Clustered Indexe)里定义的聚集键(Clustered Key),非聚集索引(Non-Clustered Indexes)与它有怎样的依赖关系。好好享受接下来的7天,到时候我们会再次见面。

围观PPT:

0602_06_聚集索引.rar

转载于:https://www.cnblogs.com/woodytu/p/4483010.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

index.html乱码问题,用apache打开文件index显示乱码为什么

用apache打开文件index显示乱码怎么回事这不是 apache 的问题。是 php 本身编码,或者 数据库编码问题。---------------------------给你看一篇别人的问题------------------------让人烦恼的 PHP UTF8 乱码解决方案088月2009一般来说,如果将 各个文件类…

广西2021普通高考成绩查询,2021广西高考成绩什么时候出

2021广西高考成绩什么时候出2021-04-22 10:39:21文/叶丹2021广西高考成绩公布时间:预计6月23日。预计6月23日对考生开放高考成绩查询通道,并公布录取最低控制分数线。届时考生可查询高考成绩,请考生密切关注广西招生考试院官网、官方微博、官…

vmware安装中标麒麟高级服务器操作系统 V7.0

vmware安装中标麒麟高级服务器操作系统 V7.0 1、下载中标麒麟高级服务器操作系统 V7.0镜像2、安装中标麒麟高级服务器操作系统 V7.02.1、新建虚拟机2.2、安装虚拟机 3、配置中标麒麟高级服务器操作系统 V7.03.1、登录系统3.2、配置静态IP地址 和 dns3.3、查看磁盘分区3.4、查看…

HDFS Safemode问题

处于safemode的集群是无法接收不论什么写操作的,包含创建文件夹、删除文件、改动文件、上传文件等等。 关于safemode,在http://www.iteblog.com/archives/977中讲的比較具体了。hdfs集群在启动和关闭的时候通常会有一段时间处于safemode,假设…

2021年衢州高考的成绩查询,2021年衢州高考状元是谁分数多少分,历年衢州高考状元名单...

2020年衢州一年一度的高考考试已经结束,今年衢州高考状元是谁呢,衢州高考状元出自哪个高中学校,文理科分数是多少分,一起来了解。一、2020年衢州高考状元名单资料2020年衢州高考状元名单和学校相关信息,截至目前发文时…

java笔试练习题

选择题(共50题,每题1.5分,共75分。多选题选不全或选错都不得分。)1. 以下属于面向对象的特征的是(C,D)。(两项)A) 重载B) 重写C) 封装D) 继承2. 以下代码运行输出是(C&am…

html块左右排列,html – 如何均匀地排列多个内嵌块元素?

我最近读了一个非常聪明的技巧来完成你所要求的工作。简而言之,你只需要使用text-align:justify;在容器元素上实现这一点,结合一个额外的不可见块。这是因为内联块元素被视为文本内容的一部分,每个元素实际上是单个单词。使用对齐…

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: user, for...

异常详情: Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: ss_user, for columns: [org.hibernate.mapping.Column(roles)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336) ~[hib…

计算机主机机箱面板指示灯,电脑主机指示灯不亮了是什么原因

公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解。话题:电脑主机指示灯不亮了是什么原因?回答:是指示灯坏了。或者是主机主板出了问题。参考回答:绿灯不亮是电源问题红灯不亮是硬盘或者…

html中水印影响文字复制,HTML中文字水印的清除方法_HTML教程

HTML中文字水印的清除方法我们在浏览某些网站的时候,看到不错的网页可能就想把上面的内容给复制下来,但是有的网站就是为了防止别人复制,而在每段文字的结尾处增加了干扰码——与背景颜色相同的文字。清除文字水印的方法比较多,主…

影响中国历史的十篇政治美文

转载于:https://www.cnblogs.com/yymn/p/4488728.html

什么是计算机网络教学反思,《计算机网络实训之常用的网络工具》教学反思

《计算机网络实训之常用的网络工具》教学反思常用的网络工具是网络管理员必须要掌握好的内容,本实验在学习完相关理论知识的基础上,让学生动手实践,亲自试验常用网络工具的使用。因为直观明了,马上见效,学生有了即时体…

C++11: final与override

C11中增加了final与override关键字&#xff0c;貌似是从Java语言中借鉴而来&#xff0c;用途也一样。看例子代码&#xff1a; 01.#include <iostream>02.03.using namespace std;04.05./* use final on a class to prevent inheriting; compilation error */06.class A /…

用计算机打字英语单词,常用计算机专业英语词汇-前401-500单词

常用计算机专业英语词汇-前401-500单词贡献者&#xff1a;邓鹏类别&#xff1a;中英混合 时间&#xff1a;2020-10-28 16:48:34 收藏数&#xff1a;2 评分&#xff1a;0返回上页举报此文章请选择举报理由&#xff1a;广告/谣言/欺诈政治敏感色情/违法信息垃圾文章其他收藏到我的…

java 文件的编码 问题

package com.io;public class Encodedemo {public static void main(String[] args)throws Exception{// TODO Auto-generated method stubString s "中国ABC";byte[] bytes1 s.getBytes();//转换成字节序列用的是项目默认的字节编码for(byte b:bytes1){//把字节转换…

定期定量采购_?采购计划员必备:各种物料采购计划与订单制定的技巧与方法...

采购与供应链全套资料包点击这里领取领取01采购计划管理planl1、制订采购计划的目的采购计划是企业根据市场供求情况、企业的生产经营能力和物料消耗规律等&#xff0c;对计划期内物料和其他物品的采购管理活动所作的预见性安排和部署。采购计划主要是确定采购的数量、时间和方…

采用计算机辅助电话调查,计算机辅助电话调查(CATI)-实验.pdf

高等院校统计学实验课系列教程( )计算机辅助电话调查 &#xff23;&#xff21;&#xff34;&#xff29; 实验凌 洁 主编上海财经大学出版社( )图书在版编目 &#xff23;&#xff29;&#xff30; 数据( ) &#xff0f; &#xff1a;计算机辅助电话调查 实验 凌洁主编 上海 上…

python rgb转lab,使用python转换图像RGB- Lab

What is the preferred way of doing the conversion using PIL/Numpy/SciPy today?解决方案Since 2010 when the linked question was asked the corresponding code moved from scipy to a separate toolkit:http://scikit-image.org/So heres the code I was actually look…