逻辑读,物理读,预读
发布时间:2020-12-12 14:35:31 所属栏目:MsSql教程 来源:网络整理
导读:1、预读怎么读,是物理读吗,是每次读取64k吗? SQLServer采用了几种方法来提高传输效率:预读扫描、预期线索、排序改善。SQLServer可以把数据再被请求之前读入数据缓冲,对下一步将被请求的数据进行推测并且使其可以从数据缓冲区中获得。有些时候很准确,但
1、预读怎么读,是物理读吗,是每次读取64k吗? SQLServer采用了几种方法来提高传输效率:预读扫描、预期线索、排序改善。SQLServer可以把数据再被请求之前读入数据缓冲,对下一步将被请求的数据进行推测并且使其可以从数据缓冲区中获得。有些时候很准确,但有些时候就没这么准确了。 SQL Server 2000 企业版根据现有内存量动态调整最大的预读页数;而该数值在 SQL Server 2000 所有其它版本中是固定的。 2、逻辑读一次读8k,64k还是两者都有? 8k,如果页当前不在缓存区高速缓存内,则执行物理读取将页读入高速缓冲存储器。 3、物理读同预读的关系? 预读管理器(read-ahead)的过程是:sqlserver会试图预测将被请求的数据,然后将其放入缓冲中。而预读管理器 能够判别是受益与预读操作的查询命令。 4、何时用预读? 到所请求的数据就在预读缓冲中。 说一说分配磁盘空间及读区数据mssql步骤 sqlserver的数据存储是以页为单位,每页8K,每8个连续页为一个区域,一个区域满了再分配另一个区域。而区域再磁盘上是分散分布的。 SQLServer产生两种类型的I/O:顺序I/O和随机I/O。顺序I/O比随机I/O效率高、寻道时间少,而且能进行64K的传输。 例如:用户发出一条select,需要从多个不同的表种读取少量数据,这会产生大量随机I/O,相反这条select只是从一个数据列的聚集索引列中返回大量数据。两者相比,后者比前者产生的随机I/O要少。 数据存储是以8k页的形式,当用户请求数据时,数据从磁盘上以8Kb的形式读入内存,然后由处理器分析。LazyWriter(缓存页)把数据页从缓冲中写入磁盘,而且把数据页保存在缓存中以备新的I/O请求使用。LazyWriter选出最近没有访问过的数据将其写入磁盘 结合iam叶,pfs叶等说明帮助中提供的,sysindexs表有一个字段放着表位置的物理地址。 一、堆 1、sqlserver在sysindexes表中查到对应的数据行 2、读取indid值(应为堆没有索引所以是0)后,sqlserver开始读取firstIAM值,获取堆的IAM的第一页(8KB)的位置。(IAM将堆的各个区域联接在一起) 3、sqlserver根据IAM提供的区域地址,一个区域一个区域的查找,一个数据页一个数据页的查找,直到获取所需的数据为止。 二、簇索引 1、sqlserver在sysindexes表中查到对应的数据行,找到indid为1后,sqlserver开始读取root列的值。(列值是根页面的地址) 2、找到根页面后开始搜索,比如要搜索的表是10条记录一页,这里是找“1981”这个值,将索引的值“1981”与根页面的索引比较。由于“1981”是在1900到2000之间。所以sqlserver开始搜索1900所在的中间页。 3、找到“1900”所在的中间页后,将索引值“1981”继续与中间页的索引比较,由于“1981”是在1980到1990之间。所以sqlserver开始搜索1980所在的数据页。(注意这一步是根据中间页找数据页) 4、找到“1980”所在的数据页后,将索引值“1981”继续与数据页的索引比较,很快就可以在这个数据页上找到“1981”的数据行了。 三、非簇索引 1、sqlserver在sysindexes表中查到对应的数据行,找到indid为后,值为2到251后,sqlserver开始读取root列值。 2、找到根页面后,将“1981”与根页面的索引比较,由于“1981”是在1900到2000之间。所以sqlserver开始搜索1900所在的中间页。(注意这一步是根据中间页找叶页面) 3、找到中间页后,将索引值“1981”继续与中间页的索引比较,由于“1981”是在1980到1990之间。所以sqlserver开始搜索1980所在的叶页面。 4、找到“1980”所在的叶页面后,继续叫索引值“1981”与叶页面上的关键字比较,在叶页面上找到关键字为“1981”的数据行ID。 5、根据数据行ID提供的数据页和数据行信息,定位到指定的数据页和数据行,找到“1981”这条记录是“晶”的。 FROM MSDN http://msdn2.microsoft.com/zh-cn/library/ms191475.aspx 预读 数据库引擎 支持称为“预读”的性能优化机制。预读首先预测执行查询执行计划所需的数据和索引页,然后在查询实际使用这些页之前将它们读入缓冲区高速缓存。这样可以让计算和 I/O 重叠进行,从而充分利用 CPU 和磁盘。 预读机制允许数据库引擎 从一个文件中读取最多 64 个连续页 (512KB)。该读取作为缓冲区高速缓存中相应数量(可能是非相邻的)缓冲区的一次散播-聚集读取来执行。如果此范围内的任何页在缓冲区高速缓存中已存在,当读取完成时,所读取的相应页将被放弃。如果相应页在缓存中已存在,也可以从任何一端“裁剪”页的范围。 有两种类型的预读:一种用于数据页,一种用于索引页。 读取数据页 用于读取数据页的表扫描在数据库引擎 中非常有效。SQL Server 数据库中的索引分配映射 (IAM) 页列出了表或索引使用的区。存储引擎可以读取 IAM 以生成必须读取的磁盘地址的排序列表。这使得存储引擎能够根据要读取的磁盘位置,将其 I/O 操作优化为按顺序执行的大型顺序读取。有关 IAM 页的详细信息,请参阅管理对象使用的空间。 读取索引页 存储引擎按键的顺序依次读取索引页。例如,下图显示了一组叶级页的简化表示法,该组叶级页包含映射叶级页的键集和中间索引节点。有关索引中页的结构的详细信息,请参阅聚集索引结构。 存储引擎使用高于叶级的中间索引页上的信息为包含键的页安排序列预读。如果请求针对的是 ABC 到 DEF 之间的所有键,则存储引擎将首先读取高于叶级页的索引页,但它并不是仅仅按顺序读取页 504 到页 556(即指定范围内的包含键的最后一页)之间的每个数据页。相反,存储引擎将扫描中间索引页并生成必须要读取的叶级页的列表。然后,存储引擎会按键的顺序安排所有读取。存储引擎还会识别出页 504/505 以及页 527/528 是相邻页,并执行一次散播读取,从而在单个操作中检索这些相邻页。如果在一个序列操作中要检索许多页,则存储引擎将一次安排一个读取块。完成这些读取子集后,存储引擎将安排同等数量的新读取,直到安排完所需的全部读取。 存储引擎使用预提取加快非聚集索引的基表查找。非聚集索引的叶级行包含指针,指向含有每个特定键值的数据行。存储引擎浏览非聚集索引的叶级页时,它也会开始计划异步读取已检索了其指针的数据行。这可以使存储引擎在完成非聚集索引的扫描之前从基础表中检索数据行。无论表是否有聚集索引,都会使用预提取。SQL Server Enterprise Edition 比 SQL Server 其他版本使用更多的预提取,可以预读更多页。在任何版本中都无法配置预提取的级别。有关非聚集索引的详细信息,请参阅非聚集索引结构。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |