【译】索引进阶(四):页和区

【译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正】 

   原文链接:传送门。

           在之前的章节中,我们在有索引和没有索引的情况下执行同一个查询,比较了各自需要的工作。我们的最主要的评判标准是“逻辑读”。我们总是比较查询聚集索引表所需要的读与查询无索引表所需要的逻辑读。现在是时候解释为什么逻辑读是比较合适的标准,同时我们也会解释实际上读了什么。

           当你向SQL SERVER提交一个请求信息的申请,它知道通过扫描整张表总是能够满足那个查询,SQL SERVER理解仅当如果使用索引比表扫描做更少的工作时,索引才对查询是有益的。如果你问SQL SERVER:是什么工作?它的回答首先便是:磁盘IO。一个查询所需要的磁盘IO是这个查询消耗的良好体现,最主要的原因在于IO消耗了两种关键资源,时间和内存。

           扫描整张表所需要的IO是一个总是被误解的标准,其原因在于SQL SERVER并不是按行读取,它读取的是页。而读取页和读取行是完全不同的工作单元。

           这个章节会尽可能的短,因为我们只关注于SQL SERVER如何执行IO。理解SQL SERVER IO,对于我们理解为什么一些索引有益于查询而另一些并没有益处是很有必要的,也可以理解为什么一些数据更新会比其他的执行得更快些,以及为什么一些索引维护任务比其他会需要更少的时间。简而言之,对于SQL SERVER IO的基本理解对于理解本系列的后续章节是很有必要的。

        当你创建一个数据库时,你指定了你的数据库被定位的文件,SQL SERVER把各个文件看做是长长的字节字符串,它在逻辑上而不是物理上将文件分割成8K大小的块。这些8K大小的块成为页。因此文件的第一个8K大小的字节块就是页#0,下一个8K是页#1,如此等等,页是最小的IO单元,每次IO,SQL  SERVER只是读写一个页,如果多个连续的页需要读或者写,SQL  SERVER选择在一个单独的IO中来处理它们。

        页不仅仅是IO的最小单位,它还是所有关系的最小单位,也就是说,如果一个页包含了表A的行,那么它将只包含表A的行,反之如果它包含了非聚集索引B的一个条目,它将只会包含非聚集索引B的条目,除了数据之外,每个页都包含了一些头信息及偏移指针,用以帮助SQL SERVER来定位到页中的各个行数据或者条目。

        在前面的章节中,我们展示了几张图片来演示索引条目的顺序,而没有管它是聚集索引或者非聚集索引,接下来我们对其中的一个图片进行扩展,展示SalesOrderDetail 表的聚集索引,来反映页的概念。

 

SalesOrderID SalesOrderDetailID ProductID   OrderQty UnitPricePage n-1:
43668        106                722         3          178.58
43668        107                708         1           20.19Page n:
43668        108                733         3          356.90
43668        109                763         3          419.46
43669        110                747         1          714.70
43670        111                710         1            5.70
43670        112                709         2            5.70
43670        113                773         2        2,039.99
43670        114                776         1        2,024.99
43671        115                753         1        2,146.96
43671        116                714         2           28.84
43671        117                756         1          874.79Page n+1:
43671        118                768         2          419.46
43671        119                732         2          356.90
43671        120                763         2          419.46
43671        121                755         2          874.79
43671        122                764         2          419.46
43671        123                716         1           28.84
43671        124                711         1           20.19
43671        125                708         1           20.19
43672        126                709         6            5.70
43672        127                776         2        2,024.99Page n+2:
43672        128                774         1        2,039.99
43673        129                754         1          874.79
43673        130                715         3           28.84
43673        131                729         1          183.94

         页的逻辑顺序和物理顺序没有必要是一样的。上图展示的示例数据是第n,n+1,n+2页,但实际上可能是n,n+9,n-5 and n+2。这种逻辑顺序和物理顺序的偏差称为外部碎片。一个页内空闲容量的百分比称为页的内部碎片。在后续章节中,我们会详细查看两种类型碎片的原因,影响及防范。

         同样也没有要求每个页包含一样的行数,通常,在聚集索引表上常规的添加及删除操作会导致每个页包含类似的行数,更正确的说,各个页大约包含相同的字节数,如果数据行或者属于条目包含可变长的列,那么每页的行数可能会变化,尽管每页的字节数保持稳定。

         一个数据行的大小等于它的列的大小加上行开销。行开销的数据取决于好多个因素,可总结 如下:

  •          每行6个字节,存储状态信息和长度信息。
  •          每个确定宽度的列一个bit,包括进最近的字节。
  •          如果存在任何可变长度的列,第一个四个字节,其他可变长度的列每个占用两个字节。
  •          在页的末尾,每行两个额外的字节用来存储偏移指针。

  因为SalesOrderDetail 表包含可变长度列,它们的大小不是预先设定的,但是平均每行95字节,因为一个页的大小是8K,SalesOrderDetail表每页包含的行数大约是75,超过了我们例子中的每页10行,在后续章节我们将讨论SQL SERVER管理工具,你可以用它来决定这些数字。

          尽管我们常常说SQL SERVER读取数据行,但这么说常常会造成误解,SQL SERVER不会读取行,它最少读取一个页。在说“给定一个索引键值,SQL SERVER能够快速访问到一行”时候,我们已经造成了误解,更正确的说法是,给定一个索引键,一个索引允许SQL SERVER快速访问一个页而不是一个数据行,一旦SQL SERVER将一个或者多个页载入内存,它会检查内存中的页并定位到所请求的数据行。

          SQL SERVER在页上做了另一个逻辑分组,它将8个连续的页分成一个逻辑单元,称为区。

          通常,区和页一样,是所有关系的单位,如果区中的一个页从属于表A或者索引B,那么区中的所有8个页都会从属于一个相同的对象。对于很小的表或者索引来说,情况会有所不同,它们不能充满整个区,在这种情况下, 超过一个表或者索引会被定位到一个相同的区中,但对于大部分对象来说,区仍是所有关系的单位。

          因此,SQL SERVER并不认为表扫描是读取表的所有行,它认为表扫描是读取表的所有页或者区,它知道它将很可能并发的处理8K,64K的IO请求来读取整个表,这将使得表扫描变得不至于像每行读取那样吓人。

          读取页和区不仅意味着做一个表扫描比我们期望的具有更少的工作,它还意味着,为了从非聚集索引受益,一个查询应该比我们期望的更具有选择性。

         考虑如下假设性的查询,查询了SalesOrderDetail 表大约4%的数据行。

 

            既然每25行数据就会有一行被选中,既然在ProductID 非聚集索引中,条目被分组放置在一起,使用ProductID 非聚集索引来定位表中的数据行看起来似乎是个好主意。但是再认真想一想。

           由于表的聚集索引是SalesOrderID / SalesOrderDetailID,而不是ProductID顺序,因此,如果平均每页包含75行,我们的歘查询从25行中选择一行,那么平均每个页变会包含3个请求行,那么平均每个页都包含了至少一个请求行,换句话说,几乎每个页都 需要被读取来满足这个查询,那么用表扫描来读取它们是最好的选择,一次读取一个区,平均每次都装在24个请求行进入内存(3*8)。

          SQL  SERVER新手常常问的一个问题是:对于非聚集索引的使用来说,一个查询应该具有何种可选择性?在本章,你现在知道了这个问题的一个答案:应该比每页一行更具有选择性,后续章节提供的信息会使你变得更精确于决定哪个索引是有益的,而哪些毫无益处。

结论

       SQL SERVER不会读取数据行,它读取一页或者多个页的数据,作为最小的IO单元,它的大小是8K,区是数据文件中8个连续的页,正常情况下,一个区以及它们的页包含一个单独对象的行或者条目,不管它是一个堆还是一个聚集索引,由于大的IO单元提供的高效性,一个查询必须更具有选择性才能从非聚集索引中受益。

       在第五章,我们将看下你能做的一些事来增加聚集索引有益于查询的可能性:使索引变成一个包含索引(index becomes a covering index )。

       换句话说,下一章是关于给索引添加包含列( included columns)。

转载于:https://www.cnblogs.com/qianxingmu/p/10411942.html

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

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

相关文章

网络体系结构

计算机网络的体系结构 网络体系结构是从功能上描述计算机网络结构计算机网络体系结构简称网络体系结构,是分层结构每层遵循某个/些网络协议完成本层功能计算机网络体系结构是计算机网络各层及其协议的集合体系结构是一个计算机网络的功能层次及其关系的定义体系结构…

计算机网络安全-RSA加密原理

一. 安全的攻击类型 危及信息安全的举动. 中断:对可用性的攻击,包括对硬件,通信线路的破坏等; 截获:对机密性的攻击,如窃听等; 篡改:对完整性的攻击,如改变数据或文件; 伪造&…

为什么神经网络不适合理解自然语言 ?

来源:AI前线作者:Ben Dickson译者:王强策划:刘燕过去十年中,人工智能行业的一大趋势就是通过创建更大的深度学习模型来解决问题。这种趋势在自然语言处理领域最为明显,这也是人工智能最具挑战性的领域之一。…

Spark详解

一.Spark 简介 Spark 和Scala 1.1 Spark 是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序; 1.2 Spark 的特点: 1.3 Scala是一门现代的多范式编程语言,可扩展式语言; 1.4 Scala 特性&…

应用层协议与网络应用

网络应用的体系结构 1、客户机/服务器(Client-Server, C/S) 服务器: 7*24小时提供服务永久访问地址/域名利用大量服务器实现可拓展性 客户机: 与服务器通信,使用服务器提供的服务间歇性接入网络可能使…

oc之脚本

进入Build Phases页面,点击加号选择“New Run Script Phases”创建Run Script 在这里添加Run Script, 1.每次编译运行版本号(bundleVersion)自增1 buildNumber$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" &q…

案例分享|突破卡脖子技术,研制协作机器人核心零部件的方向与思考

来源: 机器人大讲堂协作机器人,作为一种新型的智能机器人,扫除了人机协作的障碍,让机器人彻底摆脱护栏或围笼的束缚,让机器人与人可以在生产、制造与服务上协同作战,充分发挥机器人的效率及人类的智能&…

Spark安装及其sbt和maven 打包工具安装

一.安装准备 需要先安装hadoop,Java JDK,采用 Hadoop(伪分布式)+Spark(Local模式) 的组合.spark和sbt,maven的版本:spark-2.4.5-bin-without-hadoop.tgz 和sbt-1.3.8.tgz,maven-3.6.3; https://pan.baidu.…

SpringBoot集成Spring Security(一)登录注销

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! SpringBoot集成Spring Security(二)注册 、密码加密、修改密码 写在前面 Spring Security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案…

什么是1+N模式的新一代城市大脑建设方案

来源:城市大脑全球标准研究组前言:2021年上半年,我们在城市大脑的最新探索和研究中,提出了1N模式的新一代城市大脑建设方案。其中“1”是世界统一标准的城市神经元网络,“N”是N条城市云反射弧,这是基于互联…

图计算-Pregel-Hama

一.图计算简介 1.1 图计算是专门针对图结构数据的处理. 许多大数据都是以大规模图或网络的形式呈现;许多非图结构的大数据,也常常被转换为图模型后进行分析;图结构很好地表达了数据之间的关联性;关联性计算是大数据计…

英伟达推出全球首个元宇宙平台,豪砸数亿是为什么?

来源:AI科技大本营(ID:rgznai100)编译:禾木木翻译:AI科技大本营NVIDIA 在 SIGGRAPH 推出首个全球元宇宙平台,并赢得了最佳展示奖。目前处于公测阶段,它对 NVIDIA RTX 和 GeForce RTX GPU 用户免费开放。用户在安装完 N…

长链剖分题表

长链剖分,类似于重链剖分(dsu on tree)的一种替代算法。最广泛的用法是优化与深度有关的树上DP,以及处理一些与点分治类似的问题。有一部分长链剖分题也可以用dsu on tree做,单复杂度往往会多一个log。 每个点找到高度最大的儿子作为自己的重…

流计算

一.概述 实时获取来自不同数据源的海量数据经过实时分析处理,或的有价值的信息. 1.数据的处理流程 静态数据:数据不会发生变化,如数据仓库中的数据;流数据:数据以大量,快速.时变的流形式持续到达&#xf…

SpringBoot集成Spring Security(二)注册 、密码加密、修改密码

SpringBoot集成Spring Security(一)登录注销 写在前面 上一节创建了项目并且利用Spring Security完成了登录注销功能,这里继续说一下注册、密码加密和找回密码,代码注释较清晰。 一、web层 控制 StudentController.java package …

自动驾驶需要做哪些测试?

来源:广电计量,文:李梓熙、王闻彦参考资料来源:《有问必答 | 自动驾驶汽车之道路“测试”与“考试”》by公安部交通管理科研所微发布自动驾驶已然成为汽车行业热词。在大家殷切的期盼下,近几年上市的车型,多…

大数据的应用-UserCF和ItemCF推荐算法

一.推荐系统 1.1 推荐系统是大数据在互联网领域的典型应用,它可以通过分析用户的历史记录来了解用户的喜好,从而主动的为用户推荐其感兴趣的信息,满足用户的个性化推荐需求. 1.2 推荐系统是自动联系用户和物品的一种工具&#x…

计算机网络之Web应用

1、web与HTTP world Wide Web: 网页 网页互相链接 网页包含多个对象: 对象: HTML文件、JPEG图片、视频文件、动态脚本等 基本HTML文件: 包含对其他对象引用的链接 对象的寻址: URL(Uniform Resource Locato…

HBase错误解决(启动Hbase出现错误的替换,启动hbase shell出现ERROR KeeperErrorCode=NoNode for /hbase/master)

1.问题描述 我查阅资料发现,网上很多人和我出现相同的错误,却没有一个可以解决的教程,于是我在解决了我的一个错误后就立即写了这篇文章,需要能帮到一些人,文章不一定对每个人都有效&#xff0c…

如何使用jmeter进行并发登录测试

第一种方案直接从数据库中获取账号和密码 1、设置线程数为20 ,我们的并发用户量就是20个用户同时登录 2、添加定时器 3、设置集合点,当用户数量达到20个的时候再同时请求进行登录操作 4、添加配置元件:JDBC Connection Configuration 5、添加…