返回首页

gbase数据、南大通用产品文档:GBase8aLIMIT…OFFSET 性能优化

更新日期:2024年09月11日

说明
当集群遇到简单查询且带有LIMIT,或“LIMIT...OFFSET”时,会按优化步骤执
行,不产生汇总表。
说明

简单查询的定义包含如下SQL 语句场景:

查询为单表查询且没有子查询;

查询没有DISTINCT、聚合函数或OLAP 函数;

查询没有GROUP BY, ORDER BY 子句;

非SELECT INTO OUTFILE 查询。
使用优化方法
优化的策略为查询结果为了定位出LIMIT 后面的位置,
首先在每个data 节点进行
满足条件的记录数的COUNT(*)评估,
取得每个node 的满足条件的记录数,之后
根据各data 节点满足条件的记录数信息进一步组织SQL,
将查询语句精准发送到

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1320
指定节点执行。
示例
SELECT * FROM t WHERE a > 0 LIMIT 1 OFFSET 2;

在GBase 8c 数据库中,检查点是事务序列中一个点的快照,在该点上,可以保证堆和
索引数据文件已经同步了检查点之前写入的所有信息。
在执行检查点时,
所有脏数据页都会刷新到磁盘,
并将一个特殊的检查点记录写入日志
文件。
数据直接存储在内存中。
MOT 没有像GBase 8c 那样存储数据,
因此不存在脏页的概念。
为此,使用CALC 算法,用于主内存数据库系统中的低开销异步检查点。
CALC 检查点算法:内存和计算开销低
检查点算法具有以下优点:
降低内存使用量-每条记录在任何时候最多存储两个副本。在记录处于活动且稳定版本
相同或没有记录任何检查点时,
仅存储记录的一个物理副本,
可以最大限度地减少内存使用。

低开销:CALC 的开销比其他异步检查点算法小。

使用虚拟一致性点:CALC 不需要静默数据库以实现物理一致性点。
检查点激活
MOT 检查点被集成到GBase 8c 的封装的检查点机制中。检查点流程可以通过执行
CHECKPOINT;命令手动触发,也可以根据封装的检查点触发设置(时间/大小)自动触发。
检查点配置在mot.conf 文件中执行,请参见检查点(MOT)部分。

统一模式表实际上是在镜像表实现读写分离的基础上实现GBase8t 引擎表的无效数
据自动清除功能。
在创建统一模式表时会自动创建清理任务,在创建成功后,系统自动定期删除
GBase8t 引擎表中满足条件的数据。GBase8t 引擎表中被删除的数据不能被修改,

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 657
只能在Express 引擎中查询。
功能支持程度
创建统一模式表有如下限制:
(1) 只支持两个分区,必须指定ENGINE 为GBase8t 引擎和EXPRESS 引擎,
输入的第一个Partition 必须是EXPRESS 引擎,可以省略不指定引擎。
(2) 目前,镜像表在Express 引擎只能创建随机分布表,所以,统一模式表继承
镜像表的限制。将来镜像表会去掉此限制,统一模式表同时支持。
(3) 根据设定条件自动删除不满足条件GBase8t 引擎中的数据:
设定自动删除条件,必须指定分区,分区只能是range 分区。Range 中的参
数只能为列,不能为常量或表达式。分区列只能为date 类型。
自动创建Event,此Event 将使用特定的用户删除GBase8t 引擎表中不满足
条件的数据。此特定用户需要在UP 和RTSync 的配置文件中指定,并且和
RTSync 中的配置一致。此用户的删除数据日志将被RTSync 忽略,不被同
步到GBase 8a。
如果创建Event 报错,并不影响执行结果,返回warning,并在Express.log
中记录创建语句,需要手工创建。如果没有手工创建,则统一模式表缺少
自动删除功能,可以在任意时间补建。
语法示例
统一模式表的创建语法是基于镜像表的创建语法,并增加分区属性,实际上是具有
GBase8t 引擎表自动删除功能的镜像表,
具体的删除条件在创建统一模式表时指定。
创建时也需要指定至少一个主键,并且分区列必须作为主键之一。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 658
create united table united1
(
a int,
b varchar(50),
c date primary key
)
engine=mirror8t.inst1 partition by range(c)
(
partition p1 values less than (date_sub(current_date(),interval 1 year)),
partition p2 values less than MAXVALUE engine =gbase8t.inst1
);