openGauss例行重建索引

172 阅读5分钟

背景信息 数据库经过多次删除操作后,索引页面上的索引键将被删除,造成索引膨胀。例行重建索引,可有效的提高查询效率。

数据库支持的索引类型为B-tree索引,例行重建索引可有效的提高查询效率。

如果数据发生大量删除后,索引页面上的索引键将被删除,导致索引页面数量的减少,造成索引膨胀。重建索引可回收浪费的空间。 新建的索引中逻辑结构相邻的页面,通常在物理结构中也是相邻的,所以一个新建的索引比更新了多次的索引访问速度要快。 重建索引 重建索引有以下两种方式:

先运行DROP INDEX语句删除索引,再运行CREATE INDEX语句创建索引。

在删除索引过程中,会在父表上增加一个短暂的排他锁,阻止相关读写操作。在创建索引过程中,会锁住写操作但是不会锁住读操作,此时读操作只能使用顺序扫描。

使用REINDEX语句重建索引。

使用REINDEX TABLE语句重建索引,会在重建过程中增加排他锁,阻止相关读写操作。 使用REINDEX INTERNAL TABLE语句重建desc表(包括列存表的cudesc表)的索引,会在重建过程中增加排他锁,阻止相关读写操作。 操作步骤 假定在导入表“areaS”上的“area_id”字段上存在普通索引“areaS_idx”。重建索引有以下两种方式:

先删除索引(DROP INDEX),再创建索引(CREATE INDEX)。

删除索引。

"" openGauss=# DROP INDEX areaS_idx; 当结果显示如下信息,则表示删除成功。

"" DROP INDEX 创建索引。

"" openGauss=# CREATE INDEX areaS_idx ON areaS (area_id); 当结果显示如下信息,则表示创建成功。

"" CREATE INDEX 使用REINDEX重建索引。

使用REINDEX TABLE语句重建索引。

"" openGauss=# REINDEX TABLE areaS; 当结果显示如下信息,则表示重建成功。

"" REINDEX 使用REINDEX INTERNAL TABLE重建desc表(包括列存表的cudesc表)的索引。

"" openGauss=# REINDEX INTERNAL TABLE areaS; 当结果显示如下信息,则表示重建成功。

"" REINDEX 说明: 在重建索引前,用户可以通过临时增大maintenance_work_mem和psort_work_mem的取值来加快索引的重建。

导出并查看wdr诊断报告 生成快照数据需参数enable_wdr_snapshot=on,访问WDR快照数据需要sysadmin或monadmin权限,因此需要使用root账号或其他拥有权限的账号来生成WDR诊断报告。

执行如下命令新建报告文件。

"" touch /home/om/wdrTestNode.html 连接系统库postgres。

"" gsql -d postgres -p 端口号 -r 选择snapshot.snapshot表中两个不同的snapshot,当这两个snapshot之间未发生服务重启,便可以使用这两个snapshot生成报告。

"" openGauss=# select * from snapshot.snapshot order by start_ts desc limit 10; 执行如下命令,在本地生成HTML格式的WDR报告。

执行如下命令,设置报告格式。\a: 不显示表行列符号, \t: 不显示列名 ,\o: 指定输出文件。

"" openGauss=# \a \t \o {报告路径} 示例:

"" openGauss=# \a \t \o /home/omm/wdrTestNode.html 执行如下命令,生成HTML格式的WDR报告。

"" openGauss=# select generate_wdr_report(begin_snap_id Oid, end_snap_id Oid, int report_type, int report_scope, int node_name ); 示例一,生成集群级别的报告:

"" openGauss=# select generate_wdr_report(1, 2, 'all', 'cluster',null); 示例二,生成某个节点的报告:

"" openGauss=# select generate_wdr_report(1, 2, 'all', 'node', pgxc_node_str()::cstring); 说明:

当前openGauss的节点名固定是“dn_6001”,也可直接代入。 表 1 参数说明

参数

说明

取值范围

begin_snap_id

要查看的某段时间性能的开始的snapshot的id(表snapshot.snaoshot中的snapshot_id)

end_snap_id

结束snapshot的id,默认end_snap_id大于begin_snap_id(表snapshot.snaoshot中的snapshot_id)

report_type

指定生成report的类型。

summary detail all,即同时包含summary和detail。 report_scope

指定生成report的范围。

cluster:集群 node:集群中某个节点。 node_name

在report_scope指定为single node时,需要把该参数指定为对应节点的名称。 在report_scope为cluster时,该值可以指定为省略或者为NULL。

执行如下命令关闭输出选项及格式化输出命令。

"" \o \a \t 在/home/om/下根据需要查看WDR报告内容。

表 2 WDR报表主要内容

项目

描述

Database Stat(集群范围)

数据库维度性能统计信息:事务,读写,行活动,写冲突,死锁等。

Load Profile(集群范围)

集群维度的性能统计信息:CPU时间,DB时间,逻辑读/物理读,IO性能,登入登出,负载强度,负载性能表现等。

Instance Efficiency Percentages(集群/节点范围)

集群级或者节点缓冲命中率。

IO Profile(集群/节点范围)

集群或者节点维度的IO的使用情况。

Top 10 Events by Total Wait Time(节点范围)

最消耗时间的事件。

Wait Classes by Total Wait Time(节点范围)

最消耗时间的等待时间分类。

Host CPU(节点范围)

主机CPU消耗。

Memory Statistics(节点范围)

内核内存使用分布。

Time Model(节点范围)

节点范围的语句的时间分布信息。

Wait Events(节点范围)

节点级别的等待事件的统计信息。

Cache IO Stats (集群/节点范围)

用户的表、索引的IO的统计信息。

Utility status (节点范围)

复制槽和后台checkpoint的状态信息。

Object stats(集群/节点范围)

表、索引维度的性能统计信息。

Configuration settings(节点范围)

节点配置。

SQL Statistics(集群/节点范围)

SQL语句各个维度性能统计:端到端时间,行活动,缓存命中,CPU消耗,时间消耗细分。

SQL Detail(集群/节点范围)

SQL语句文本详情。