GaussDB-分布式全局二级索引

GaussDB-分布式全局二级索引

可获得性

本特性自503.1.0版本开始引入。

特性简介

在指定的表上创建全局二级索引(Global Secondary Index,简称GSI)。

客户价值

全局二级索引允许用户定义与基表分布不一致的索引,从而实现非基表分布键点查/点查和范围查询性能提升,去除UNIQUE/PRIMARY KEY需包含基表分布键的约束。

特性描述

  • 对于某一基表,定义按照用户指定方式分布的若干个GSI,GSI上除了索引键以及用户指定的CONTAINING列之外,同时记录数据元组对应的xc_node_hash(基表分布键的hash值)、tableoid(当基表为分区表时)、ctid、xmin、xmax等。
  • 当用户对基表执行IUD(INSERT、UPDATE、DELETE)操作时,通过RETURNING对GSI进行IUD。
  • 在查询计划生成阶段通过判断谓词条件中属性的组合,生成对应的GSI Scan(Index Only Scan)算子来对GSI进行查询。

特性原理

通过分布式计划构建、优化器模型构建、执行器新算子实现、以及分布式GBTree构建等,实现分布式全局二级索引功能,具体如下:

  • 解析层:

    对于IUD与SELECT,在语义解析阶段设置hasGSI,标记当前Query Block是否含有GSI,即为Query结构体添加hasGSI成员变量,用于标记当前Query Block中的RangeTblEntry是否包含GSI。LP(Light Proxy)与FQS(Fast Query Shipping)需要根据查询树中的关系(表,RangeTblEntry)、属性(列,Var)等信息来判断一个查询是否适用。

  • 优化器模块:
    • 通过GSI Hint来支持符合规则的查询走GSI Scan。
    • 对于涉及GSI的查询,借助Index Only Scan实现GSI Scan。其中,选择率、基数估计、代价模型、路径生成、计划生成模块在复用Index Only Scan逻辑的基础上,增加分布信息。
    • 对于涉及GSI的IUD,构建新的分布式执行计划。
  • 执行器模块:
    • 对于IUD,新增GSI IUD算子。
    • 对于涉及GSI的查询,GSI Scan借助Index Only Scan实现,同时支持Bypass。
  • 存储模块:
    • 创建GSI索引分为两个阶段:生成GSI元数据、插入索引数据。
    • GTM-LITE:在GTM-LITE模式下,各个DN维护自己的一套xid,因此在DN内部可通过复用UBtree可见性判断的逻辑,以保证对涉及GSI操作的正确性。目前版本只支持在GTM-LITE模式下创建GSI,暂不支持其他GTM模式。
    • UBTree支持GBTree:由于UBTree是一种local索引,并未体现DN信息。对于local索引,由ctid可唯一定位到堆表上的元组。但是对于GSI,由于涉及到跨DN,因此,兼顾到扩容、主备切换等场景,引入逻辑值xc_node_hash(基表分布键的hash值)来确定DN,进一步的,可通过ctid + xc_node_hash来唯一对应至堆表上的元组,从而使得UBTree支持GBTree。
    • Analyze:

      新增语法:analyze global index index_name for table table_name,正常analyze和analyze table时会跳过gsi。对GSI执行analyze时,对于DN, relpages可以直接得到,reltuples会通过采样的方式估计得到。同时,CN会读取DN的结果用于CN侧GSI统计信息的更新。

  • 升级:

    添加升级脚本,以适配索引相关系统视图。修改pg_attribute系统表,插入xc_node_hash的信息。

  • 工具:

    适配gs_dump工具,使其能够正常返回索引定义;适配gs_redis工具,在基表切换node group时,同步切换所有其GSI的node group分布信息;使用gds、copy导入建有GSI的基表时,将同步GSI数据。

特性增强

503.2.0版本增强:

  • 创建性能优化:提供create_gsi_opt参数,利用GSI BUILD和STREAM算子提升创建GSI的性能。
  • UPDATE/DELETE性能优化:将索引键置入WHERE子句中,提升GSI UPDATE/DELETE操作性能。
  • 支持基表为USTORE。
  • 支持SQLPATCH、STORAGE PARAMETER、CLUSTER、REINDEX TABLE 、VACUUM FULL、CN端获取DN端计划,ALTER PARTITION功能增强。
  • 支持部分索引和表达式索引。
  • 支持在线创建。
  • 支持并行创建。

505.0.0版本增强:

  • GSI支持回表查询。
  • 支持使用gsitable hint指导生成GSI回表查询计划。
  • COPY、GDS导入建有GSI的基表时,将同步GSI数据。

505.1.0版本增强:

  • 支持插入GSI走STREAM模式。
  • 支持COPY、GDS增量导入。
  • 支持对HASHBUCKET表、段页式表创建GSI。
  • 支持MERGE INTO功能

特性约束

  • 同基表约束,GSI的分布列不支持更新(UPDATE、MERGE INTO)操作。
  • 只支持GTM-LITE模式下创建GSI,不支持其他GTM模式,在其他模式下创建GSI会报错。
  • Astore不支持创建GSI以外的UBTree,不支持对GSI创建分区。
  • 创建与基表分布一致的GSI时,执行时会报错。
  • 只支持对Ustore表执行CREATE GSI CONCURRENTLY,对Astore表执行CREATE GSI CONCURRENTLY会报语法错误;不支持表达式索引和部分索引CREATE GSI CONCURRENTLY,会报语法错误。不支持在线重建GSI。
  • 支持对基表为hash分布的行存Astore表、Ustore表、分区表、HASHBUCKET、段页式、创建hash分布的GSI,不支持基表为复制表、list/range分布等,对于GSI本身不支持hash分布以外的分布。
  • 不支持对基表列名或者ctid、xc_node_hash、xmin、xmax、tableoid(当基表为分区表时)、tablebucketid(当基表为HASHBUCKET表时)增加_new$$、_NEW$$后与自身列名重复的基表创建GSI。
  • 如果在执行VACUUM FULL、CLUSTER或者REINDEX操作时中断,表上的GSI可能会变为UNUSABLE状态,此时查询语句走GSI会报错,建议执行REINDEX INDEX重建GSI。
  • 当基表为分区非HASHBUCKET表时,GSI最多支持27列;当基表为HASHBUCKET非分区表时,GSI最多支持27列;当基表为HASHBUCKET分区表时,GSI最多支持26列;当基表为非分区非HASHBUCKET表最多支持28列(包括索引键和分布键)。
  • 对于创建GSI(非在线)、重建GSI,以及涉及重建GSI的操作:比如分区表分区操作(包括DROP、TRUNCATE、MERGE、SPLIT、EXCHANGE PARTITION)指定UPDATE DISTRIBUTED GLOBAL INDEX,ALTER TABLE涉及重建数据的操作,HASHBUCKET表ALTER SET TABLESPACE操作、MOVE PARTITION操作,建议开启STREAM模式,以达到最优性能。(其中,STREAM模式指设置enable_stream_operator参数为ON,并设置create_gsi_opt参数置为build)
  • 不支持UPSERT,建有GSI的基表上不支持IUD returning功能。
  • 在对建有GSI的基表执行COPY、GDS数据导入时,需要开启enable_stream_operator参数,以达到最优数据导入性能。
  • 当前会使GSI失效的操作:REINDEX数据库级、CLUSTER数据库级/分区级、ALTER TABLE PARTITION(DROP、TRUNCATE、MERGE、SPLIT、EXCHANGE PARTITION未指定UPDATE DISTRIBUTED GLOBAL INDEX将失效分区表上的所有GSI,其中,EXCHANGE PARTITITON未指定UPDATE DISTRIBUTED GLOBAL INDEX将同步失效普通表上的所有GSI) 。
  • 回表基于STREAM,继承STREAM相关约束。考虑到STREAM通信时延,当选择率过低或者谓词命中行数较少时,性能非最优,不建议使用回表计划,建议与普通索引配合使用。
  • 对于Insert into select批量插入场景,建议打开enable_stream_operator,插入执行STREAM计划 (当基表为段页式表、HASHBUCKET表,以及防篡改表时,不会执行STREAM计划,仍然走PGXC计划),如果关闭enable_stream_operator,执行计划采用回到CN的方式,性能较差(类比503.1.0版本创建GSI性能)。
  • 对于INSERT、UPDATE、DELETE,执行计划采用分布式执行计划,会有性能损失,其中,UPDATE/DELETE批量场景,执行计划采用回到CN的方式,性能较差。
  • GSI支持表达式索引,但存在以下约束:
    • 同基表约束,不支持分布键包含表达式(且无法创建索引列仅包含表达式的GSI,因为此时分布键必定为表达式),创建时会报语法错误。
    • 同普通索引约束,不支持CONTAINING列中包含表达式,创建时会报语法错误。
    • 若表上存在以"expr"为前缀的列名,不支持创建带有表达式的GSI,创建时会报语法错误。

依赖关系

无。

 
posted @ 2024-10-29 16:02  jerrywang1983  阅读(41)  评论(0)    收藏  举报