跳转到内容

关系数据库设计/逻辑与物理设计

来自维基教科书,开放的书籍,开放的世界

物理设计含义“业务实施设计”

[编辑 | 编辑源代码]

在这种情况下,物理设计的目的是优化数据库在特定业务案例中的性能(通常是速度)。

一本教科书中提到的具体技术包括:适当的索引、查询优化、垂直分区、适当的规范化级别。这需要查看数据库结构和要使用的查询。

适当的索引可以提高提取大量行或执行连接的查询的性能。范围查询或包含不等式条件的查询通常在使用 B+ 树索引(或 ISAM 索引,B+ 树的静态形式)时表现更好。

聚集索引,其中行按索引顺序排序,并且可能作为 B+ 树的叶节点存储为块,在检索范围时也往往表现更好,因为连续块可以加载,并且该范围内的块中的所有或大多数行都包含在内。

多字段索引可能在针对多个属性进行选择的某些查询中表现更好。

在一些数据库中,可以强制查询规划器使用索引或进行顺序扫描,或者通过执行诸如“id1 + 0 = id2”而不是“id1 = id2”之类的黑客操作来使用性能更高的计划,因为后者默认使用一些不利的自动优化,而前者强制进行顺序扫描,这可能使缓冲区加载得更好。这可能被称为特异性物理设计。其他人将其称为查询优化。数据库可能具有评估同一查询的替代形式的功能。替代形式的示例包括为条件分组放置括号,例如

  SELECT a, b, c
    FROM A
   WHERE c > c1 AND c < c2
GROUP BY c

而不是

  SELECT * 
    FROM (select a,b,c from A where c > c1 and c< c2) 
GROUP BY c

物理设计含义“软件设计”

[编辑 | 编辑源代码]

最好将其称为更抽象的设计与更不抽象的设计,因为物理设计通常只是数据库对抽象操作系统概念(文件)的特定组织。随机访问文件可以组织为磁盘上的块,主要优化可能是,无论“物理”设计如何,块的开头都与硬盘上某种基本输入/输出系统调用读取的物理块对齐,该物理块映射到操作系统内存范围。我只是在猜测。

让我们以基于文件简单数据库系统(XBase 数据库系列)为例。Xbase 数据库表物理对象由包含一个标题和随后记录的文件组成。标题包含基本信息,如标题长度(或记录的开头)、记录数量、每个记录的长度以及字段描述列表,包括每个字段的名称、大小和类型。表物理对象被组织为堆,新创建的表行附加到文件的末尾,标题中的记录数量也会增加。

这意味着如果要实现ALTER TABLE的 SQL 数据声明功能,最简单的方法是创建一个新的表物理对象,创建一个包含任何更改后的字段描述的新标题,并将所有记录重新写入,包含任何添加的字段,或不包含任何删除的字段。

字段描述最方便地描述具有固定大小类型的字段,例如NUMERIC(10,2)表示一个 10 个字符的小数,最后 2 个字符位于小数点右侧,可以用一个 11 个字符的字段表示,其中一个额外的字符用于小数点。

当需要可变长度字段类型时,例如VARCHARMEMO,那么字段的大小是例如 4 字节 32 位无符号数的大小(4 x 8 = 32)。此数字是与主 DBF 文件关联的另一个文件(例如 DBT 文件)中的偏移量,该文件存储可变长度数据。在该偏移量处,数据以表示数据长度的 4 字节数字开头,后面跟着该数字表示的字节的数据本身。

SQL 数据操作功能,即DELETE, UPDATEINSERT的“逻辑”设计功能,可以通过为每个记录使用一个字节标志来实现删除,更改给定字段偏移量处记录的内容来实现更新,以及附加到文件的末尾来插入记录。

选择功能可以以蛮力方式实现,即顺序扫描每个记录,或者如果存在索引并且它们与 WHERE 子句中使用的字段相关,则可以查找索引。

对于等式条件,只需查找索引即可,但对于比较条件(例如 BETWEEN、≥ 或 ≤),可以使用具有有序物理排列的物理索引。

如果记录数量很少,则可以通过在应用程序运行开始时顺序扫描索引表,将内存中的哈希表或内存中的平衡二叉树用作索引。考虑到当今可用的内存量,这几乎总是更好的选择,并且像双缓冲这样的技术,其中一次性读入块记录以顺序扫描每个块,可以使索引初始化保持足够快。

如果构建非常大的索引的时间使应用程序启动速度过慢,可以使用外部 B+ 树作为范围索引,以及使用外部的基于块的哈希算法(例如线性哈希或可扩展哈希),这也有助于在将内存缓存块写入磁盘时动态地将索引持久保存到永久磁盘存储中。通过了解索引是决定逻辑能力“SELECT ... WHERE ..”时间性能的物理机制之一,数据库设计人员可以

  • 通过在需要的地方提供索引和检查生成什么样的查询计划(连接是否使用索引,因为这样做预期会带来很大的速度提升,而不是顺序扫描?)来优化查询。
  • 尝试通过调整数据库功能或 SELECT 语句本身来影响查询规划器。
  • 有信心将数据转储到文件(例如 DBF 格式),并在代码中编写索引功能以扩展应用程序。
  • 以及其他可能会让关系数据库设计人员对自己的工作感到满意的酷炫功能。

虽然堆组织似乎很合理,但有时会选择使用主键作为哈希材料,以基于哈希的方式将文件组织成块,并且需要使用可扩展哈希或线性哈希而不是内存构建的哈希表,因为这是记录组织方式,作为磁盘哈希表中块/桶中的条目。可扩展哈希和线性哈希通过块递增,因此“块堆”成为堆附加到文件区域的粒度,而不是将新记录附加到“记录堆”文件区域。

可扩展哈希和线性哈希在数据结构维基教科书中进行了描述,以及 B+ 树。该书还提供了用于内存缓存文件持久线性哈希的 Java 实现,以及 2 个 Java 和一个 C++ 的 B+ 树实现,以及一个 Java 的 B 树实现,这对比了 B+ 树中的实际设计差异。

华夏公益教科书