挑战mssql高手

dlkfth 2003-08-21 06:40:09
1、预读怎么读,是物理读吗,是每次读取64k吗?
2、逻辑读一次读8k,64k还是两者都有?
3、物理读同预读的关系?
4、何时用预读?

帮助的不要,以上sql帮助我都看过。



那位高说一说分配磁盘空间及读区数据mssql步骤,结合iam叶,pfs叶等说明帮助中提供的,但是我没有完全看懂,sysindexs表有一个字段放着表位置的物理地址。


大家也可以谈谈自己的理解,很多书不提这部分,或者照抄帮助。
有可能题目大,不好答回答一部分也可
...全文
136 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjw800614 2003-11-09
  • 打赏
  • 举报
回复
继续迷茫!
txlicenhe 2003-09-03
  • 打赏
  • 举报
回复
还是不知道有什么用。
chpp_2000 2003-09-03
  • 打赏
  • 举报
回复
up
liukaiii 2003-08-25
  • 打赏
  • 举报
回复
具体怎么用呢
workhand 2003-08-23
  • 打赏
  • 举报
回复
study.
lvcheng606717 2003-08-23
  • 打赏
  • 举报
回复
厉害呀up
冷箫轻笛 2003-08-23
  • 打赏
  • 举报
回复
不懂!收藏先~~~
triout 2003-08-23
  • 打赏
  • 举报
回复
收藏,学习ing
fmdsaco 2003-08-23
  • 打赏
  • 举报
回复
有人说大力是微软的特使,现在我有点相信,,
好贴呀
收起来
dlkfth 2003-08-23
  • 打赏
  • 举报
回复


逻辑读一次读8k,64k还是两者都有?

8k,如果页当前不在缓存区高速缓存内,则执行物理读取将页读入高速缓冲存储器

这个大力正确。

其他我在验证中。。。。


过一段时间我把我的理解同验证贴出来。



imafool 2003-08-23
  • 打赏
  • 举报
回复
预读即是缓冲。使用“最近最少使用”提高命中率。
erigido 2003-08-22
  • 打赏
  • 举报
回复
收藏哈
CrazyFor 2003-08-22
  • 打赏
  • 举报
回复
SQL Server 构架


I/O 构架
数据库的主要作用是存储和检索数据,因此执行大量磁盘读写操作是数据库引擎的固有特性之一。磁盘 I/O 操作消耗很多资源,且需相对较长的时间才能完成。在关系数据库软件中,多数逻辑都涉及高效地建立 I/O 使用模式。

Microsoft® SQL Server™ 2000 将很多虚拟内存分配给高速缓冲存储器,并使用此高速缓存减少物理 I/O。每个 SQL Server 2000 实例都有自己的高速缓冲存储器。数据从数据库磁盘文件读入高速缓冲存储器。不必再次物理读取数据即可满足多次逻辑读取数据。数据一直保留在高速缓存内,直到已有一段时间不被引用且数据库需要缓存区读入更多数据。数据只有在被修改后才重新写入磁盘。在物理写将新数据传输回磁盘之前,数据可由逻辑写多次修改。

在 SQL Server 2000 数据库内的数据存储在 8 KB 页内。每组的八个邻接页是一个 64 KB 扩展盘区。高速缓冲存储器也被划分为 8 KB 页。

SQL Server 实例的 I/O 被划分为逻辑和物理 I/O。数据库服务器每次从高速缓冲存储器请求页时,即发生逻辑读取。如果页当前不在缓存区高速缓存内,则执行物理读取将页读入高速缓冲存储器。如果页当前在高速缓存内,则不产生物理读取;高速缓冲存储器只是使用已在内存内的页。当内存中页内的数据被修改时,发生逻辑写。当将页写入磁盘时,发生物理写。在将页物理写入磁盘之前,它有可能在内存内停留足够长的时间以至发生多次逻辑写。

SQL Server 实例的基本性能优化任务之一包括调整 SQL Server 内存的大小。目的是使高速缓冲存储器足够大以使逻辑读取与物理读取的比率达到最大,但又不至大到使过多的内存交换开始对页文件产生物理 I/O。SQL Server 2000 实例在默认配置设置下自动完成这一任务。

通过在虚拟内存内保持相对较大的高速缓冲存储器,SQL Server 实例可以显著减少所需的物理磁盘读取数。一个经常引用的页被读入高速缓冲存储器后很可能会继续留在那里,因此完全不用再进一步读取。

SQL Server 2000 使用 Microsoft Windows NT® 和 Windows® 2000 的下面两个功能来提高其磁盘的 I/O 性能:

散播-聚集 I/O
在 Windows NT 4.0版 Service Pack 2 中引入散播-聚集 I/O 之前,Windows NT 上所有用于磁盘读写的数据必须在邻接的内存区内。如果某个读取以 64 KB 为单位传送数据,则读取请求必须指定邻接 64 KB 内存区域的地址。散播-聚集 I/O 允许读取或写入操作将数据传入或传出内存的非邻接区域。Windows 2000 也支持散播-聚集 I/O。

如果 SQL Server 2000 实例在 64 KB 扩展盘区中读取,则不须分配单个 64 KB 区并将各个页复制到高速缓冲存储器页内。它可以找到八个缓冲区页,然后执行一个散播-聚集 I/O 以指定这八个缓冲区页的地址。Windows NT 或 Windows 2000 直接在缓冲区页内放入八个页,使 SQL Server 实例不需要执行单独的内存复制。

异步 I/O
在异步 I/O 中,应用程序从 Windows NT 或 Windows 2000 中请求读取或写入操作。Windows NT 或 Windows 2000 立即将控制返回给应用程序。应用程序然后可以执行其它的工作,过一会儿执行测试以查看读写操作是否已完成。相反,在同步 I/O 中,操作系统直到读和写完成才将控制返回给应用程序。使用异步 I/O 使 SQL Server 实例得以在个别线程执行批处理时使它们所完成的工作最多。

SQL Server 支持对每个文件执行多个并发异步 I/O 操作。SQL Server 2000 动态确定一个实例能为任何文件发出的最大 I/O 操作数。

©1988-2000 Microsoft Corporation。保留所有权利。
stonea168 2003-08-21
  • 打赏
  • 举报
回复
up
nba23 2003-08-21
  • 打赏
  • 举报
回复
我来学习的,但对大力和经理的答案抱有信心
zarge 2003-08-21
  • 打赏
  • 举报
回复
占座学习
mgan 2003-08-21
  • 打赏
  • 举报
回复
我看看啊 来学习 把
———————————^@^————————
good good study
day day up
______________________@_@________________
pengdali 2003-08-21
  • 打赏
  • 举报
回复
说一说分配磁盘空间及读区数据mssql步骤

re:
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表有一个字段放着表位置的物理地址。

re:
一、堆
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”这条记录是“晶”的。

(SQLServer MVP 大力)
pengdali 2003-08-21
  • 打赏
  • 举报
回复
1、预读怎么读,是物理读吗,是每次读取64k吗?
SQLServer采用了几种方法来提高传输效率:预读扫描、预期线索、排序改善。SQLServer可以把数据再被请求之前读入数据缓冲,对下一步将被请求的数据进行推测并且使其可以从数据缓冲区中获得。有些时候很准确,但有些时候就没这么准确了。

SQL Server 2000 企业版根据现有内存量动态调整最大的预读页数;而该数值在 SQL Server 2000 所有其它版本中是固定的。

2、逻辑读一次读8k,64k还是两者都有?

8k,如果页当前不在缓存区高速缓存内,则执行物理读取将页读入高速缓冲存储器。

3、物理读同预读的关系?

预读管理器(read-ahead)的过程是:sqlserver会试图预测将被请求的数据,然后将其放入缓冲中。而预读管理器
能够判别是受益与预读操作的查询命令。

4、何时用预读?
到所请求的数据就在预读缓冲中。
kanshangren 2003-08-21
  • 打赏
  • 举报
回复
好专业呀,UP
加载更多回复(5)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧