举报投诉联系我们 手机版 热门标签 鳄鱼CMS
您的位置:鳄鱼CMS > PostgreSQL 实现

PostgreSQL 实现

2023-04-01 05:31 PostgreSQL 实现

 PostgreSQL 实现

63.4.1. B-Tree 结构
63.4.2. Deduplication

本节介绍 B-Tree 索引实现详细信息,这些对高级用户可能有用。 更多信息请参见在源分发中的src/backend/access/nbtree/README文件,内部聚焦的 B-Tree实现描述。

63.4.1. B-Tree 结构

PostgreSQL B-Tree 索引是多级树结构,其中树的每个级别都可以用作双链接的页列表。 单个元页存储在索引的第一个段文件开始时的固定位置。所有其他页都是叶页或内部页。叶页是在树的最低层上的页。 所有其他层级由内部页组成。每个叶页都包含指向表行的元组。每个内部页都包含指向树中下一级别的元组。 通常,超过 99% 的页面是叶页。 内部页和叶页都使用 第 68.6 节中描述的标准页格式。

当已有叶页不能适应传入元组时,新叶页将添加到B-Tree索引中。 page split操作通过将部分项目移动到新页面为最初属于溢出页上的项目提供空间。 页拆分还必须插入新的downlink到父页中的新页,这可能会导致父页依次拆分。 页拆分cascade upwards以递归的方式。 当根页最终无法适合新的下行链接时,发生root page split操作。 通过创建比原始根页高一个级别的新根页,为树结构添加新级别。

63.4.2. Deduplication

重复项是叶页元组(指向表行的元组),其中所有 索引键列的值与同一索引中至少一个其他叶页元组的相应列值匹配。 重复元组在实践中很常见。 当启用可选技术:重复时,B-Tree 索引可以对重复项使用特殊的、节省空间的表达方式。

重复数据删除的工作为通过定期将重复元组合并在一起,为每个组构建一个posting list元组。 列键值在此表示形式中仅显示一次。 后面跟着指向表中行的TID的排序数组。 这显著减少了索引的存储大小,在其中每个值(或列值的每个不同组合)平均出现多次时。 查询的延迟可以显著降低。 总体查询吞吐量可能会显著增加。 常规索引清空的开销也可以显著降低。

注意

B-Tree重复数据删除对于包含 NULL 值的duplicates同样有效,即使根据任何 B-Tree 操作符类的 = 成员,NULL 值永远不会彼此相等。 对于理解磁盘上 B-Tree 结构的实现的任何部分,NULL 只是索引值域中的另一个值。

当插入的新项无法适应现有叶页时,重复数据删除过程进行缓慢。这可以防止(或至少延迟)叶页拆分。 不像 GIN 倒排列表元组,B-Tree倒排列表元组不需要在每次插入新重复项时展开;它们仅仅是叶页原始逻辑内容的替代物理表示方式。 此设计优先考虑混合读写工作负载的一致性能。 大多数客户端应用程序可以从使用重复数据删除中获得适度的性能收益。默认情况下,将启用重复数据删除。

CREATE INDEXREINDEX 应用重复数据删除来创建倒排列表元组,尽管它们使用的策略有所不同。 每组重复的普通元组遇到从表中取出的排序输入将合并到倒排列表元组,在添加到当前挂起的叶页之前。 单独倒排列表元组尽可能以TIDs封装。 叶页以通常的方式写出,没有任何分开的重复数据删除步骤。 此策略非常适合CREATE INDEXREINDEX,因为它们是一次性的批处理操作。

由于索引中重复值很少或没有重复值,因此无法从重复数据删除中获益的写频繁工作负载将产生少量的、固定性能损耗(除非显式禁用重复数据删除)。 deduplicate_items存储参数可用于禁用单个索引中的重复数据消除。 只读工作负载永远不会有任何性能损失,因为读取倒排列表元组至少与读取标准元组表示一样高效。 禁用重复数据删除通常没有帮助。

在 MVCC下B-Tree 索引不能直接感知,同一逻辑表行可能有多个现存版本;对于索引,每个元组都是一个独立对象,需要自己的索引条目。 Version duplicates有时可能会累积并对其查询延迟和吞吐量产生不利影响。 这通常发生在UPDATE重的工作负载中,其中大多数单独的更新无法应用HOT优化(通常因为至少修改了一个索引列,需要一组新的索引元组版本 —一个新的元组对each and every索引)。 实际上,B-Tree重复数据删除可以改善由版本变动引起的索引膨胀。 请注意,即使唯一索引中的元组也不一定物理上唯一的,在版本变化而存储在磁盘上时。 重复数据删除优化有选择地应用于唯一索引中。它针对那些看起来具有重复版本的页面。 高级目标是给VACUUM更多的时间,在版本改动导致 unnecessary页面拆分之前。

提示

应用一种特殊的启发式方法来确定是否应在唯一索引中进行重复数据删除操作。 它通常可以直接跳到拆分叶页,避免在无益的重复数据删除传递上浪费周期会降低性能。 如果你担心重复数据删除的开销,可以考虑deduplicate_items = off。 在唯一索引中启用重复数据删除没有什么坏处。

由于实现级别的限制,不能在所有情况下使用重复数据消除。 在CREATE INDEXREINDEX时决定重复数据删除安全性。

请注意,重复数据删除被认为是不安全的,不能用于下列涉及相同数据之间语义显著差异的情况:

  • text, varchar, 和 char在使用nondeterministic排序规则时不能使用重复数据删除。 在等值基准之间必须保留大小写和重音差异。

  • numeric重复数据删除。 数字显示比例必须在相等的基准之间保留。

  • jsonb不能使用重复数据消除,因为jsonbB-Tree操作符类在内部使用numeric

  • float4float8不能使用重复数据删除。 这些类型对 -00具有不同的表示形式,但被视为相等。 必须保留此差异。

在未来版本的PostgreSQL中,还有一个实现级限制可能取消:

  • 容器类型(例如复合类型、数组或范围类型)不能使用重复数据删除。

无论使用操作符类或排序规则如何,还有一个实现级别限制适用:

  • INCLUDE 索引不能使用重复数据删除.


阅读全文
以上是鳄鱼CMS为你收集整理的 PostgreSQL 实现全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  •  PostgreSQL 实现

    PostgreSQL 实现

    2023-04-22 PostgreSQL 实现

    66.4.1. GIN 快速更新技术66.4.2. 部分匹配算法在内部,一个GIN索引包含一个在键上构建的 B 树索引,其中每一个键是一个或者多个...

  •  PostgreSQL 备份清单格式

    PostgreSQL 备份清单格式

    2023-05-14

    目录71.1. 备份清单顶级(Top-level)对象71.2. Backup Manifest File Object71.3. Backup Manifest WAL Range Object由pg_basebac...

  •  PostgreSQL dblink

    PostgreSQL dblink

    2023-04-18 PostgreSQL dblink

    dblink_connect— 打开一个到远程数据库的持久连接dblink_connect_u— 不安全地打开一个到远程数据库的持久连接dblink_disconnec...

  •  PostgreSQL dblink_close

    PostgreSQL dblink_close

    2023-04-22

    dblink_close — 关闭一个远程数据库中的游标大纲dblink_close(text cursorname [, bool fail_on_error]) 返回 textdblink_close...

  •  PostgreSQL fuzzystrmatch

    PostgreSQL fuzzystrmatch

    2023-06-09

    F.15.1. SoundexF.15.2. LevenshteinF.15.3. MetaphoneF.15.4. 双 Metaphone fuzzystrmatch模块提供多个函数来判断字符串之间的...

© 2024 鳄鱼CMS eyucms.com 版权所有 联系我们