返回首页

gbase数据、南大通用产品文档:GBase8sAUTO_STAT_MODE 配置参数

更新日期:2024年09月11日

使用 AUTO_STAT_MODE 配置参数来启用或禁用有选择地更新模式,仅更新 UPDATE
STATISTICS 操作中分布的过时的或丢失的数据,而不是更新分布的所有数据统计。
onconfig.std 值
未设置。如果 AUTO_TUNE 配置参数设置为1,则有选择地更新统计。

0 = 禁用有选择的 UPDATE STATISTICS 操作。
1 = 启用有选择的 UPDATE STATISTICS 操作。
生效
编辑 onconfig 文件并重启数据库服务器之后。
当您通过运行 onmode -wf 命令在 onconfig 文件中动态地重置该值时。
当您通过运行 onmode -wm 命令重置内存中的该值时。

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

如果在当前 onconfig 文件中未设置 AUTO_STAT_MODE 值,且设置 AUTO_TUNE 配置参数。

用法
当 AUTO_STAT_MODE 配置参数或 AUTO_STAT_MODE 会话环境变量启用有选择地更新自动模
式时,仅更新 UPDATE STATISTICS 操作中分布的过时的或丢失的数据, 数据库服务器使
用 STATCHANGE 配置参数值来确定需要更新的表或分片分布统计。

跟踪(SQL 管理 API)
随同 admin() 或 task() 函数,
使用 set sql tracing database 参数来启动或停止对数据库的跟
踪,或罗列哪些数据库正被跟踪。
语法

元素
描述
关键考虑
database_name 数据库名。 指定一个数据库名。

用法
使用 set sql tracing database add 参数来指定对一个或多个数据库的跟踪,而不是跟踪所有
数据库。缺省为所有数据库。在单个 admin() 或 task() 函数中指定至多六个参数。数据库
名的最大数目可设置为 16。
使用 set sql tracing database clear 参数来从正被跟踪的数据库列表清除所有数据库。
跟踪返
回到缺省的全部数据库。
使用 set sql tracing database list 参数来罗列正被跟踪的数据库。
使用 set sql tracing database remove 参数来从正被跟踪的数据库列表移除单个数据库。
当您使用 set sql tracing database 参数时,
仅可指定一个数据库的名称。
在您可有最多 16 个
数据库名时,必须在分别的函数调用中指定每一附加的数据库。您每次调用该函数时,该
函数添加另一数据库到列表,直到列表包含 16 个数据库。
示例

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

下列示例设置对名为 db1、db2 和 db3的三个数据库设置 SQL 跟踪:
EXECUTE FUNCTION task("set sql tracing database add","db1");
EXECUTE FUNCTION task("set sql tracing database add","db2");
EXECUTE FUNCTION task("set sql tracing database add","db3");

功能描述
为表中的数据重建索引。
在以下几种情况下需要使用REINDEX 重建索引:
索引崩溃,并且不再包含有效的数据。
索引变得“臃肿”,包含大量的空页或接近空页。
为索引更改了存储参数(例如填充因子),并且希望这个更改完全生效。
使用CONCURRENTLY 选项创建索引失败,留下了一个“非法”索引。
注意事项
REINDEX DATABASE 和SYSTEM 这种形式的重建索引不能在事务块中执行。
REINDEX CONCURRENTLY 这种形式的重建索引不能在事务块中执行。
语法格式

重建普通索引。
REINDEX { INDEX | [INTERNAL] TABLE | DATABASE | SYSTEM } name [ FORCE ];

重建索引分区。
REINDEX
{ INDEX | [INTERNAL] TABLE
} name
PARTITION partition_name [ FORCE
];
参数说明

INDEX
重新建立指定的索引。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1209

INTERNAL TABLE
重建列存表或Hadoop 内表的Desc 表的索引,如果表有从属的“TOAST”表,则这个
表也会重建索引。

TABLE
重新建立指定表的所有索引,如果表有从属的“TOAST”表,则这个表也会重建索引。
如果表上有索引已经被alter unusable 失效,则这个索引无法被重新创建。

DATABASE
重建当前数据库里的所有索引。

SYSTEM
在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。

CONCURRENTLY
以不阻塞DML 的方式重建索引(加ShareUpdateExclusiveLock 锁)。重建索引时,一
般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现重建过程中不阻塞
DML。
此选项只能指定一个索引的名称。
普通REINDEX 命令可以在事务内执行,但是REINDEX CONCURRENTLY 不可以在
事务内执行。
列存表、全局分区表和临时表不支持CONCURRENTLY 方式重建索引。
REINDEX SYSTEM CONCURRENTLY 不会执行任何操作,因为系统表不支持在线重
建索引。
说明:- 重建索引时指定此关键字,需要执行先后两次对该表的全表扫描来完成
build,
第一次扫描的时候创建新索引,
不阻塞读写操作;
第二次扫描的时候合并更新第一次
扫描到目前为止发生的变更。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1210
因为需要执行两次对表的扫描和build,且必须等待现有的所有可能对该表执行修改的
事务结束,所以该索引的重建比正常耗时更长,同时带来的CPU 和I/O 消耗对其他业务也
会造成影响。
如果在索引构建时发生失败,
那会留下一个
“不可用”
的索引。
这个索引会被查询忽略,
但它仍消耗更新开销。这种情况推荐的恢复方法是删除该索引并尝试再次
CONCURRENTLY 重建索引。
由于在第二次扫描之后,
索引构建必须等待任何持有早于第二次扫描拿的快照的事务终
止,而且建索引时加的ShareUpdateExclusiveLock 锁(4 级)会和大于等于4 级的锁冲突,
因此在创建这类索引时,容易引发卡住(hang)或者死锁问题。例如:
两个会话对同一个表重建CONCURRENTLY 索引,会引起死锁问题;
两个会话,一个对表重建CONCURRENTLY 索引,一个drop table,会引起死锁问题;
三个会话,会话1 先对表a 加锁,不提交,会话2 接着对表b 重建CONCURRENTLY
索引,会话3 接着对表a 执行写入操作,在会话1 事务未提交之前,会话2 会一直被阻塞;
将事务隔离级别设置成可重复读(默认为读已提交),起两个会话,会话1 起事务对表
a 执行写入操作,不提交,会话2 对表b 重建CONCURRENTLY 索引,在会话1 事务未提
交之前,会话2 会一直被阻塞。

name
需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。
说明:REINDEX DATABASE 和SYSTEM 只能重建当前数据库的索引,
所以name
必须和当前数据库名称相同。

FORCE
无效选项,会被忽略。

partition_name
需要重建索引的分区的名称或者索引分区的名称。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1211
取值范围:
如果前面是REINDEX INDEX,则这里应该指定索引分区的名称;
如果前面是REINDEX TABLE,则这里应该指定分区的名称;
如果前面是REINDEX INTERNAL TABLE,
则这里应该指定列存分区表的分区的名称。
须知:REINDEX DATABASE 和SYSTEM 这种形式的重建索引不能在事务块中
执行。
示例
--创建一个行存表tpcds.customer_t1,并在tpcds.customer_t1 表上的c_customer_sk
字段创建索引。
gbase=#CREATE TABLE tpcds.customer_t1
(
c_customer_sk
integer
not null,
c_customer_id
char(16)
not null,
c_current_cdemo_sk
integer
,
c_current_hdemo_sk
integer
,
c_current_addr_sk
integer
,
c_first_shipto_date_sk
integer
,
c_first_sales_date_sk
integer
,
c_salutation
char(10)
,
c_first_name
char(20)
,
c_last_name
char(30)
,
c_preferred_cust_flag
char(1)
,
c_birth_day
integer
,
c_birth_month
integer
,
c_birth_year
integer
,
c_birth_country
varchar(20)
,
c_login
char(13)
,
c_email_address
char(50)
,
c_last_review_date
char(10)
)
WITH (orientation = row)
gbase=#CREATE INDEX tpcds_customer_index1 ON tpcds.customer_t1 (c_customer_sk);
gbase=#INSERT INTO tpcds.customer_t1 SELECT * FROM tpcds.customer WHERE
c_customer_sk < 10;
--重建一个单独索引。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1212
gbase=#REINDEX INDEX tpcds.tpcds_customer_index1;
--实时重建一个单独索引。
gbase=#REINDEX INDEX CONCURRENTLY tpcds.tpcds_customer_index1;
--重建表tpcds.customer_t1 上的所有索引。
gbase=#REINDEX TABLE tpcds.customer_t1;
--实时重建表tpcds.customer_t1 上的所有索引。
gbase=#REINDEX TABLE CONCURRENTLY tpcds.customer_t1;
--删除tpcds.customer_t1 表。
gbase=#DROP TABLE tpcds.customer_t1;
优化建议

INTERNAL TABLE
此种情况大多用于故障恢复,不建议进行并发操作。

DATABASE
不能在事务中reindex database。

SYSTEM
不能在事务中reindex 系统表。