I/O统计中的扫描计数和预读是什么意思?
SQL2000数据库
查询分析器中,执行一条SQL语句后 ,在下方的消息区域显示出本次查询的i/o统计,如:
表 'fs_AUTO '。扫描计数 1,逻辑读 0 次,物理读 0 次,预读 0 次。
逻辑读,物理读的意思我找到了,但是剩下两个在网上搜了半天,以及sql2000的帮助文档都没有找到,恳请各位朋友代为解答,谢谢!
另:oracle的统计I/O跟这个差不多吗?它的扫描计数跟sql server的含义一样?
------解决方案--------------------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”这条记录是“晶”的。