典型的RDBMS如何存储和定位块?

时间:2011-10-26 10:44:29

标签: database io rdbms

我知道块是FS和DBMS的基本物理元素。关系数据库管理系统(如MySQL或Oracle)如何存储其块数据,然后将其加载到内存中?它使用文件系统吗?搜索方法?或者只是像文件系统那样裸I / O?

我到处寻找答案并找不到答案,虽然我确定块存储是很多人必须知道的,看看实现的数量。

感谢您的帮助。

编辑:只是为了澄清一下,我想知道的是DBMS如何在存储中实际实现这个块。它是使用文件系统集群还是完全绕过FS?

1 个答案:

答案 0 :(得分:2)

我对MySQL和Oracle如何存储数据一无所知,但是我可以对Microsoft SQL Server的工作方式有所了解

在SQL Server中,基本的存储单元是一个大小为8 KB的页面。所有内容都存储在页面大小的块中,几乎所有内存都以这8 KB块的形式组织和分配。例如,以下所有内容都存储在页面中:

  • 表格中的数据
  • 索引
  • 执行计划

每当页面被使用时,必须必须加载到内存中并保持加载直到SQL Server完成该页面的工作,但是当工作完成时,它不仅被丢弃,而是SQL服务器尝试在内存中缓冲尽可能多的页面,因此页面将存在于缓冲池中 - 仍然在内存中的页面列表可用于在需要时重新调整用途(丢弃然后在访问其他页面时使用)

SQL Server会跟踪缓冲池中可用的页面,以避免在可能的情况下读取或写入磁盘 - 当页面重新调整用途时,会有一组复杂的规则(包括“懒惰写入”任何脏页)为了尝试将经常使用的页面保留在内存中并最大限度地减少缓存未命中,应该对磁盘进行任何更改。基本上,SQL Server不断尝试使用尽可能多的内存,而不会触发操作系统页面错误。

至于它如何知道要加载哪些页面主要是向下索引 - 索引(也存储在页面中)的结构使得SQL Server能够遍历索引并找到相关记录。具有最小读数的索引(取决于查询)。然后,索引包含通知SQL Server哪些页面包含实际数据的链接。

这是一个大规模的过度简化,但至少应该大致概述一下如何运作。如果您有兴趣了解更多信息,我建议使用Wikipedia page on SQL Server,特别是“数据存储”部分。还有一些关于SQL Server内部的书籍,我发现它们非常有用。