热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQL中全局索引的优化建议

众所周知,大多数支持分区的主要数据库管理系统引擎也支持全局索引。PostgreSQL有非常强大的分区支持,但是缺少全局索引的支持。全局索引不仅确保了分区的唯一性

全局索引是父表中映射到许多基础表分区的单个索引。父表本身没有一个统一的底层存储,因此它必须从物理分布式表中检索满足索引约束的数据。非常粗略地说,全局索引在一个地方累积数据,因此跨越多个分区的数据可以一次性访问,而不是单独查询每个分区。


image.png


目前,在PostgreSQL中没有可用的全局索引实现,因此我想提出一个新特性。i向社区发送了一份提案,现在讨论开始了。在这个提议中,我只请求对B树的全局索引支持,稍后将考虑其他索引方法。


使用的术语



  • 全局索引

    一对多索引,其中一个索引映射到所有分区表。



  • 分区索引(索引分区)

    当全局索引变得太大时,这些索引会被分区,以保持性能和维护开销可控。这些不在这项工作的范围内。



  • 本地索引

    本地索引是特定表分区的本地索引;即它不跨越多个分区。因此,当我们在父表上创建索引时,它将为其所有分区创建一个单独的索引。PostgreSQL在引用本地索引时使用了术语“分区索引”。这项工作将修复PostgreSQL的术语,以便术语与其他数据库管理系统保持一致。




为什么我们需要PostgreSQL中的全局索引?

全局索引有望对PostgreSQL中的分区功能集进行两次非常重要的升级。对于针对分区的多个本地索引的查询,它有望显著提高读取性能,并在分区之间添加一个唯一的约束。

唯一约束

数据唯一性是建立索引的关键要求。对于跨多个分区的全局索引,必须对索引列强制执行唯一性。这实际上转化为一种独特的约束。

执行

目前,在分区的父表上创建的伪索引不包含任何数据。相反,当需要索引搜索时,它会取消对本地索引的引用。这意味着必须对多个索引进行评估,然后将数据合并。但是,对于全局索引,数据将驻留在父表中声明的全局索引中。这避免了多级索引查找的需要,因此在某些情况下,读取性能预计会显著提高。但是,在写入(插入/更新)数据期间,会有负面的性能影响。稍后将对此进行更详细的讨论。

创建全局索引–语法

可以通过在索引语句中添加“global”关键字来创建全局索引。或者,可以指定“LOCAL”关键字在分区上创建本地索引。我们建议将这组关键字称为:“分区_索引_类型”。默认情况下,partition_index_type将设置为LOCAL。以下是创建索引语法的示例。

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name [ USING method ]
    ( { column_name | ( expression ) } [LOCAL | GLOBAL] [ COLLATE collation ]
[ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( column_name [, ...] ) ]
    [ WITH ( storage_parameter = value [, ... ] ) ]
    [ TABLESPACE tablespace_name ]
    [ WHERE predicate ]

将索引指向元组

目前,CTID携带已知堆(表名)的页面和偏移信息。但是,在全局索引的上下文中,索引中的这一信息是不够的。由于索引预计会携带来自多个分区(堆)的元组,因此仅靠CTID无法将索引节点链接到元组。这需要为堆名携带附加数据,以便与每个索引节点一起存储。

优化器

优化器面临的挑战是在本地索引和全局索引同时存在时进行选择。有许多悬而未决的问题,包括评估扫描全球指数的成本。本地索引何时应该优于全局索引,反之亦然?

写性能和真空

因为分区表中的每个更改都必须向上传播到父表的全局索引,所以写入性能会有所下降。这可以被认为是表中的另一个索引,但是,[轻微]性能下降将是因为全局索引可能携带更大的数据集,其中包含来自多个分区的数据,导致更高的树遍历和更新时间。这适用于写入和真空过程。

然而,如何在代码中处理这个问题,以及如何更好地优化这个过程,仍然是一个悬而未决的问题。

结论

众所周知,大多数支持分区的主要数据库管理系统引擎也支持全局索引。PostgreSQL有非常强大的分区支持,但是缺少全局索引的支持。全局索引不仅确保了分区的唯一性,还提高了读取性能。

来源:PostgreSQL中全局索引的优化建议



推荐阅读
author-avatar
言_信者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有