挑战mssql高手

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

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



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


大家也可以谈谈自己的理解,很多书不提这部分,或者照抄帮助。
有可能题目大,不好答回答一部分也可
...全文
133 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)
环境要求: Discuz! 兼容 PHP 4.0.6, MySQL 3.23, PostgreSQL 7.1 以上各版本和各种操作系统环境,在安全模式下也能完好运行. 算法及数据结构: 我们始终致力于开发最优化的算法和数据结构,从事 PHP 与 MySQL 的开发的过程中,我们力求每行代码都充分发挥开发工具的效率优势,Discuz! 是一个挑战 PHP 应用极限的应用程序. Discuz! 开发组具有丰富的 cache 处理经验,到 Discuz! 3.0,内建了包含系统设定到模板系统在内的 PHP 语法生成内核,此内核可直接生成程序格式的缓存,cache 技术的广泛应用使得 Discuz! 的代码效率再上新的台阶. Discuz! 中包含了众多独创或独有的处理方法,使得 Discuz! 可以轻松承受比其他类似产品更多的贴子数量和在线人数,成为目前最高效快速的论坛产品之一.在实现同样功能的前提下,Discuz! 力争占用数据库资源最小,页面处理时间最短.在一台配置良好的 P4 级 UNIX 主机上, 100 万贴论坛平均页面处理时间不超过 0.03 秒(搜索除外),页面平均数据库查询数不超过5 个,最大承载在线人数超过 5000 人,如果构建 Apache 和数据库分离的双机系统,负载能力和速度都将获得更大的提升. 数据库操作: Discuz! 依靠专门设计的数据库操作类实现数据库存取,目前提供 MySQL 和 PostgreSQL支持模块,具有专有错误处理模块,通过 Email 实时报告数据库错误. 数据结构更经过精心的设计,从字段到表的分配,索引的构建,都经过缜密的考虑,相同数据量的论坛,Discuz! 占用的数据库容量和其他类似产品相比要小. 程序内核中查询遵循 ANSI SQL 规范,短期内即可通过新增数据库类的方式移植到 SQLServer 等其他数据库系统. 模板体系: Discuz! 全部版本都使用模板与程序分离的方式构建,Disucz! 2.0 是目前惟一一个采用编译模板系统构建的商业化产品,该核心由 Crossday Studio 独立开发,与传统的模板技术相比更快捷,内容修改也更容易,随着 Discuz! 2.0 应用的普及,必将引起一股编译模板技术应用的高潮. 依赖于 Discuz! 3.0 的编译模板体系,全部提示信息,均在完全不影响程序效率的前提下,用语言包实现,自 2.0 以来,彻底支持多模板,多语言和多风格.每个模板可使用不同的语言界面,不同的内码设定和不同的风格设置,模板可在线编辑,也可通过 FTP 直接上传,给界面定制带来了前所未有的方便.不懂 html 的新手通过风格设置的修改,或设计高手手工修改模板,都可实现论坛外观的完全定制. 论坛功能: 除具有满足讨论需要的全部功能外,Discuz! 还对标准的论坛体系做了丰富的扩展. 全论坛编译模板和国际化内核,更换前/后台提示语言不需要修改程序和模板 可自定义最大在线人数,UNIX 负载情况限制用户访问论坛 附件采用文件存储,读取速度更快,占用数据库更少,同时对可能发生的安全问题做了一一处理,又有完善的从记录到文件的全面管理功能. CookieFree 技术,得益于自建的会话跟踪体系,Discuz! 不需任何设置即可在不使用Cookie 或被禁止的情况下正常登录或使用论坛. 全新设计的搜索功能,使得新的搜索比以往快数倍,具有可共享的搜索缓存,有效减少数据库负载. 自定义 Discuz! 代码功能,可对代码进行扩充并支持最多三个动态代码参数. 自定义会员信息项目功能:支持选单及在帖子中显示该自定义项目. 独有的内建论坛访问与流量统计系统,紧密结合论坛自身的功能,在实现一般外挂统计系统全部功能的同时,最大限度的降低了系统资源的消耗. 预留完善的插件接口,插件只需通过修改设置文件即可被加入到论坛系统中;程序中也处处考虑插件的应用,即使插件对数据结构有修改,也不会影响论坛的正常使用和升级. 权限控制: Discuz! 具有全面而严密的权限与访问控制系统.内置不同的会员用户组,系统用户组,自动根据积分或系统头衔确定用户所在组.用户组可任意编辑和添加,各组拥有可调的十几项关键权限设定,涵盖论坛使用的各个方面. 支持交叉用户组,普通用户组和管理用户组可以交叉并得到交叉权限. 版主和超级版主的权限可以具体设定,并具有自己的管理面板,可进行允许范围内的管理操作. 论坛支持密码加密,同时可在每个论坛内给用户组分配不同的权限,实现最大限度的权限与访问控制. Discuz! 支持积分和具备防止作弊功能的用户评分,可设定积分的加分方式,也可设定用户评分权限及最大评分数;可设定主题和附件的查看/下载积分,并可设定具有此设定权限的用户组;贴子中独有 [hide] 代码,可根据回复或积分隐藏相应内容,满足不同要求. 后台管理: Discuz! 具有快速智能的论坛后台管理程序,不仅提供详细周密的论坛和用户组权限设定,而且,可根据 10 余种以上的条件实现用户编辑,批量删贴,附件编辑等,且可自动对有关的数据,如用户发帖数,积分,论坛数据等等做智能处理,确保了批量操作后统计数据的精确性.内核级访问控制,可设定及屏蔽恶意刷新及 DoS 攻击 管理程序中可方便的修改界面方案中的各种参数,熟悉以后新建一个界面方案只需一分钟就可办到,同时也可在线编辑模板,或进行模板的导入,导出操作.每一个管理操作都被记录在案,方便管理员的互相监督.同时提供版主管理记录功能,可按时间顺序查看版主进行的每一个管理操作,对版主负责程度的评定更具有科学性. 数据维护: Discuz! 提供了迄今最强大的 web 界面数据备份和恢复功能,具有足以应付超大数据库的分卷备份能力,使得管理员不需任何服务器权限即可轻松维护 Discuz! 数据库.更有远程数据读取功能,两台主机之间传递论坛数据不经过本地不消耗任何本地资源即可完成,创建备份论坛或更新镜像论坛易如反掌. 后台管理程序中可方便的查看数据库的使用情况,同时提供数据库优化功能以消除存储碎片,保证存取效率. 安全保证: Discuz! 3.0 坚固的数据结构和最少化数据库查询,使得 Discuz! 可以在极为繁忙的服务器环境下快速稳定运行 在用户资料存储中和传递中,密码全部使用 RSA-MD5 不可逆加密,有效保证论坛及用户资料的安全. 专门为脆弱页面设计了防刷新系统,自动阻止恶意访问和攻击. Discuz! 独有的全程操作记录,完整详细的记录了论坛运行情况.管理记录采用 PHP 文件格式存储,既能防止被非法查看或下载,又不占用数据库资源.同时具有自我尺寸控制技术,各种记录自动保存最新的 500 条,即使管理员也无法删除各种记录,犹如黑匣子般提供最可靠的安全保证. Discuz! 能有效处理页面格式,保证页面及表格的完整性.安全检查应用于每一个Discuz! 代码中,可自动屏蔽贴子及签名等中的恶意代码.

34,576

社区成员

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

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