返回首页

gbase数据、南大通用产品文档:GBase8sindex compress repack shrink 参数:优化

更新日期:2024年09月11日

B-tree 索引的存储(SQL 管理 API)
随同 admin() 或 task() 函数,使用 index compress repack shrink 参数来压缩分离的
B-tree 索引,合并空闲空间(重新打包)并归还分区中的空闲空间(收缩)。
语法:索引压缩命令参数

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 752 -

命令参数
下表包含每一参数的简要说明。
表 1. 索引压缩操作的参数
参数
描述
compress
压缩索引。
parallel
并行地运行压缩或重新打包操作。
为每一表的分片或分片列
表启动一个线程,且跨越这些分片并行地运行该操作。
repack
通过将数据移到索引的前部来合并空闲空间。
shrink
将索引末端的空闲空间归还到 dbspace,从而减少索引的总
大小。

命令元素
下表显示您可用来压缩、重新打包和收缩索引的元素。
表 2. 索引压缩命令元素
元素
描述
关键考虑
index_name
您想要压缩的索引名称。
必需的。
您必须使用系统目录表中相同的大写或小
写字母。
database_name
包含您想要压缩的索引的
数据库名。
可选的。
如果您未指定数据库,
则数据库服务器使用

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 753 -
元素
描述
关键考虑
当前的数据库。
如果您输入数据库名,
则必须使用与系统目
录表中相同的大写或小写字母。
owner
包含您想要压缩的索引的
数据库的所有者名。
可选的。
如果您未指定所有者,
则数据库服务器使用
当前的所有者。
如果您输入所有者名,
则必须使用与系统目
录表中相同的大写或小写字母。

用法
您可压缩一个在分片的或未分片的表上分离的 B-tree 索引。
要被压缩,索引必须有至少 2000 个键。如果索引内的分片没有至少 2000 个键,则当创
建索引时数据库服务器不压缩索引或分片。即使有新的键添加到索引,索引也保持不压缩。
如果您想要压缩该索引,
请运行另一个带有 index
compress 参数的 SQL 管理 API
task()
或 admin() 函数。
要确定索引是否包含最小键数,请运行 oncheck -pT 命令并查看 Number of keys 域中的
信息。
通常情况下,请您在压缩操作之后执行重新打包操作,并在重新操作之后执行收缩。
压缩操作仅压缩索引的叶子(底层)。
你可取消操作,例如在 DB-Access 中按下 CTRL-C。
你不可解压缩索引。如果您想要解压缩索引,则可删除压缩的索引并重新创建它。
示例
下列命令并行地压缩、重新打包并收缩索引。
EXECUTE FUNCTION task("index compress repack shrink parallel",
"ind5", "customer", "jayson");

问题现象

GBase 8a MPP Cluster 最佳实践
5 FAQ
文档版本(2022-02-11)
南大通用数据技术股份有限公司
108
exists 子查询中的having 包含外表的列计算结果出错:
create table dm_evt_boct36_c(cust_no varchar(16),amount
decimal(24,3),post_date varchar(8),ibk_no varchar(5));
create table ldm_savtxn_c(to_custom_no varchar(16),post_date
varchar(8),cus_no varchar(34),trans_acct varchar(17),amount
decimal(24,3));
insert into dm_evt_boct36_c
values('0000000398926582',2000.000,'20170102','40004'),('0000000398926
582',1500.000,'20170102','40004');
insert into ldm_savtxn_c
values('0000000398926582','20170102','0000000398900686','9003500018321
006',-500.000),('0000000398926582','20170102','0000000398900686','9003
500018321006',-300.000);
select boct.*
from dm_evt_boct36_c boct
where cust_no='0000000398926582' and exists
(select sum(-sav.amount) from ldm_savtxn_c sav where
sav.to_custom_no=boct.cust_no and sav.cus_no <>boct.cust_no group by
sav.trans_acct having sum(-sav.amount)/abs(boct.amount) >=0.2 and
sum(-sav.amount)/ abs(boct.amount) <=1.2);
解决方法:
exists 子查询优化的逻辑是把子查询修改为子查询和外表的join,但是having
中存在外表列,group by 中没有,就会出现非严格group by,这样出现的结果集
是不固定的,优化无法支持。所以在新的版本中屏蔽
correlated_subselect_auto_optimize =1 时,exists 子查询中的having包含外
表的列时,不走优化。以保证结果集的正确。
所以在9.5.2.30、

|
5 | 2016-06-10 | B
|
198 |
1022 |
|
8 | 2016-02-05 | C
|
NULL |
NULL |
|
6 | 2016-08-05 | C
|
201 |
0 |
|
9 | 2016-08-06 | C
|
NULL |
0 |
|
7 | 2016-08-09 | C
|
129 |
1296 |
| 14 | 2016-07-02 | D
|
172 |
0 |
| 13 | 2016-09-01 | D
|
165 |