在学习“数据布局”的过程中,遇到了“物化”这个词,并没有明确的定义和解释。什么是物化,物化有什么作用?
这个问题与物化视图无关,也不特定于任何特定的 DBMS。
语境
我从中学习的来源:Jens Dittrich 博士教授的 Youtube 视频:将关系映射到设备。
在时间点 9:24,我们有这个术语实现。他说这是一个从物理页面到存储设备的过程。
并且此时还有一个问题:既然物理页也应该属于主存,那么如果我们有一个主存数据库,那么数据布局只存在于主存中,会不会有物化的过程呢?
在学习“数据布局”的过程中,遇到了“物化”这个词,并没有明确的定义和解释。什么是物化,物化有什么作用?
这个问题与物化视图无关,也不特定于任何特定的 DBMS。
我从中学习的来源:Jens Dittrich 博士教授的 Youtube 视频:将关系映射到设备。
在时间点 9:24,我们有这个术语实现。他说这是一个从物理页面到存储设备的过程。
并且此时还有一个问题:既然物理页也应该属于主存,那么如果我们有一个主存数据库,那么数据布局只存在于主存中,会不会有物化的过程呢?
与流行的误解相反,“物化”与将任何内容写入磁盘或“存储”层无关。在执行查询的过程中,您有两个离散的概念,
这里的基本思想是,给定一个
WHERE
子句之类的东西,你可以该过程是无状态的。最终构建了一个管道,并且在该管道的某个地方发生了魔法(一般规则是越早越好)。
让我们看一个排序,如何在管道中对
1
, , 进行排序?你不能。这意味着如果该表未按该字段聚集,您唯一的选择是5
3
那个“事物”,更典型的是“物化结果集”是一个“关系”,它本身通常像任何其他受所有相同操作的表一样建模。
物化可能是问题需求(如排序)、资源短缺或规划器限制的结果——在 PostgreSQL 中,CTE 是一个优化栅栏。这意味着 CTE 外部的优化不能下推到 CTE 中。为什么?因为在 CTE 完成时:它的结果在某处(或磁盘上)的缓冲区中,流水线的步骤就结束了。
真实世界验证
nodeMaterial.c
即调用tuplestore_begin_heap
以获取存储结果集的位置MySQL 在半连接、子查询、聚合和窗口函数代码的上下文中使用它。此外,他们有一个
MATERIALIZATION
这样记录的提示,有问题的视频。
我建议忽略视频的这一部分。他将“物化”定义为从“物理页面到存储设备”的步骤。这不是该术语在任何实践中的定义。
出于芯片设计和内核设计的目的,物理页面和虚拟页面之间存在差异。
例如,在 x86 平台中,分页是在长模式 (x86_64) 下打开的,如果不通过“逻辑页面”,您将无法访问物理内存。他称从逻辑页面到物理页面的解析过程为“去虚拟化”。我从来没有听说过,很可能他也没有听说过,因为它是 CPU 上微码的一个功能,而且都是专有的,所以命名它执行的单个进程有点没用。出于同样的原因,“物化”似乎同样无用,而且更加令人困惑。如果您知道物理页面,您怎么可能不知道存储设备?如果它是物理的,它不会被进一步抽象。这个方案中的逻辑<->物理映射是什么意思?反正对我来说很陌生
选择的答案
这在任何研究或数据库用语中都是不正确的,我会质疑所有使用的声明
malloc
,memcpy
或者正如作者继续所说fork
的(或不使用)COW 是“物化”的说法。如果它们以其他方式引用我上面描述的机制,它们可能是物化的“一部分”。我的视频是关于必须进行的不同映射,以便将关系一直映射到硬件。在实践中,这些不同的映射和线性化步骤经常被混淆和混淆。这是不幸的,因为为某些映射步骤做出的不同的、通常是硬编码的决策可能会在以后阻碍查询性能。有时,对这些映射之一的简单更改可能会导致全新的产品线(例如“列存储”、PAX/Parquet)。
在数据库研究中,术语“物化”表示任何形式的数据存储,即任何最终在任何存储层上实际设置一些字节的操作。示例包括深拷贝、内存分配(不要与 malloc() 混淆)、复制、物化视图(而不是动态视图)、流水线内物化,以及沿存储层次结构的任何形式的(部分)副本。
在视频中,我介绍(并简化)了不同的映射步骤。数据库中世界的简化视图是所有内容最终都存储到物理页面中。物理页是数据库研究中的一个固定术语。但请确保您了解它只是一种抽象。它是 DBMS 中的存储单元。在讨论某些概念(如查询处理)时,我们可以放心地忽略这些物理页面(目前)发生的情况。这就是我在视频中 9:26 所做的,因为这不是关于硬件的课程:我说来自物理页面的数据被具体化到存储设备。再说一遍:后者是一个更长的故事,例如 ACID 中的因素,特别是“D”,恢复,CC,......
但请注意,物理页面与物理内存不同,物理页面映射到主内存页面(几乎总是由虚拟内存提供的虚拟页面)或映射到其他一些设备,例如硬盘或 SSD。大多数设备也在内部进行了虚拟化,例如,一些 SSD 在内部使用了 RAID 5。
当然,对于虚拟内存、快照和不同形式的存储间接,这个术语有时有点难以理解。有时你相信你会实现,但...
例如,假设你在 unix 中 fork 一个子进程。看起来该过程具有数据的物理副本,对吗?不,它没有。只有通过写时复制,您才会收到物理副本。所以,有时物化和不物化之间的界限会变得模糊。
希望有帮助。