返回首页

gbase数据、南大通用产品文档:GBase8a关联顺序优化

更新日期:2024年09月11日

1.
优化原因
GCluster 的优化器不会调整LEFT JOIN 语句的顺序,而用户语句的JOIN 顺
序可能不是最优,导致查询性能较低。
2.
SQL 特征
语句包含多个LEFT JOIN,
多个LEFT JOIN 的ON 条件均为t1.colX = tn.colX
如:
SELECT x1.* FROM x1
LEFT JOIN x2 ON x1.many_duplicate_value = x2.many_duplicate_value
LEFT JOIN x3 ON x1.no_duplicate_value = x3.no_duplicate_value
LEFT JOIN x4 ON x1.hash_col = x4.hash_col;
3.
优化场景
语句特征满足上面的特征描述。
LEFT JOIN 的右表,一些表可以直接与左表形成Hash JOIN 关系,一些表可
能会导致左表发生膨胀。
4.
优化效果
让形成Hash JOIN 关系的LEFT JOIN 先执行,避免拉表。
例如SQL 特征中描述的语句,因为left join x4 on x1.hash_col = x4.hash_col
是Hash 分布式JOIN,因此可以提到最前面,直接分布式执行。
让膨胀率小的LEFT JOIN 先执行,减小拉表数据量。
如果参与JOIN 条件的列的值的重复度较高,则很可能会造成LEFT JOIN 结
果发生膨胀。一般来说,使用主键列参与的JOIN 条件,膨胀率是最小的;

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1306
而重复值越多的列,膨胀率就越可能高。
例如SQL 特征中描述的语句,因left join x3 on x1.no_duplicate_value =
x3.no_duplicate_value 对x1 的膨胀率比left join x2 on x1.many_duplicate_value
= x2.many_duplicate_value 小,因此可以把left join x3 提到left join x2 前面。
通过这种调整,避免对膨胀后的数据拉表,减小了拉表数据量。
示例语句:
SELECT x1.* FROM x1
LEFT JOIN x2 ON x1.many_duplicate_value = x2.many_duplicate_value
LEFT JOIN x3 ON x1.no_duplicate_value = x3.no_duplicate_value
LEFT JOIN x4 ON x1.hash_col = x4.hash_col;
改写后语句
SELECT x1.* FROM x1
LEFT JOIN x4 ON x1.hash_col = x4.hash_col
LEFT JOIN x3 ON x1.no_duplicate_value = x3.no_duplicate_value
LEFT JOIN x2 ON x1.many_duplicate_value = x2.many_duplicate_value;
说明

因x1.hash_col = x4.hash_col 使用Hash 分布列,因此left join x4 调
整到第1 个位置;

因x1.no_duplicate_value = x3.no_duplicate_value 的膨胀率比
x1.many_duplicate_value = x2.many_duplicate_value 的膨胀率低,因
此把left join x3 调整到left join x2 之前。

Unable to convert JDBC escape format date string to localized date string
日期值的 JDBC 转义格式必须指定为 {d 'yyyy-mm-dd'} 格式。请验证指定的 JDBC 转义
格式是否正确。
如果这些环境变量中的任何一个设置为连接数据库 URL 字符串或属性列表中的值,则请
验证 DBDATE 和 GL_DATE 设置是否具有正确的日期字符串格式。

您可以使用 onbar -P 命令来打印已使用 ON-Bar 实用程序备份的逻辑日志。
要运行 ON-Bar 命令,
您必须是 root 用户或 gbasedbt 用户,
或者是 UNIX™ 上 bargroup 组
的成员。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 47 -

用途

示例:打印特定事务

示例:打印多个逻辑日志文件
打印已备份的逻辑日志

表 1. onbar -P 命令的选项
选项
用途
-b
打印与 Blob 空间 Blob 页面相关联的逻辑日志
记录。
数据库服务器将这些记录作为 Blob 空间日志记
录的一部分存储在逻辑日志备份介质上。
-c
使用压缩字典来展开压缩的数据。
-l
打印逻辑日志记录的长列表。
日志记录的长列表包含整个日志记录的复杂十六
进制和 ASCII 转储。
-n starting_id-ending_id
打印包含在指定的日志文件范围中的逻辑日志记
录。starting_id 选项是要打印的第一个日志的
标识。ending_id 选项是要打印的最后一个日志
的标识。starting_id 选项的值必须小
于 ending_id 选项的值。
以连字符分隔开始和结束标识值。请勿包含空格。
-n unique_id
打印包含在指定的日志文件中的逻辑日志记录。
unique_id 选项是逻辑日志的唯一标识号。要确

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 48 -
选项
用途
定特定逻辑日志文件的唯一标识,请使用 onstat
-l 命令。
-P
打印已备份的逻辑日志信息
-q
不打印程序头
-ttblspace_num
打印与使用 tblspace_num 选项指定的表空间
相关联的记录。
以无符号整数或十六进制值的形式指
定 tblspace_num 值。如果您没有使用 0x 前
缀,那么值将解释为整数。整数必须大于零,并且
必须存在于 systables 系统目录表
的 partnum 列中。
-u username
打印特定用户的记录。用户名必须为现有登录名,
并且必须符合登录名的特定于操作系统的规则。
-xtransaction_num
只打印与指定的事务相关联的记录。
transaction_num 必须是在零和 TRANSACTIONS
-1 之间(包括零和 TRANSACTIONS -1)的无符号
整数。
其他信息:仅在前滚期间生成错误这一不太可能的
情况下使用 -x 选项。当此情况发生时,数据库
服务器将向包含违规事务的事务标识的消息日志
发送消息。您可以将此事务标识与 -x 选项一起
使用,以查找错误的原因。
用途
要查看已备份的逻辑日志,存储管理器必须正在运行。
此命令的输出将打印到 stdout。
示例:打印特定事务

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 49 -
以下命令打印由 gbasedbt 用户 针对表空间 1048722 执行,且包含在逻辑日志文件 2 中
的单个事务的相关信息:
onbar -P -n 2 -l -q -b -u "gbasedbt" -t 1048722 -x 1
此命令的输出可能为:
log uniqid: 2.
1665d0 120 DPT 1 2 0 5
00000078 0002006c 00000010 0000fefe ...x...l ........
00000001 00000000 000077e3 00000000 ........ ..w.....
00000005 00000005 00002a24 00000001 ........ ..*$....
00100004 0a0c21b8 00002a48 00000001 ......!. ..*H....
00100006 0a0c2288 00002ea1 00000001 ......". ........
0010001b 0a0c3810 00002bee 00000001 ......8. ..+.....
00100015 0a0c3a18 00002a3d 00000001 ......:. ..*=....
00100005 0a0c57c0 ......W.
166648 60 CKPOINT 1 0 1665d0 1
0000003c 00000042 00000010 0000fefe ...<...B ........
00000001 001665d0 000077e3 00000000 ......e. ..w.....
00010005 00000002 00000002 001665a0 ........ ......e.
00000007 ffffffff 00084403 ........ ..D.
示例:打印多个逻辑日志文件
以下命令打印标识为 2、3、4、5、10、11 和 12 的逻辑日志文件的逻辑日志记录:
onbar -P -n 2-5 -n 10-12