GaussDB(DWS)一键式现场信息收集工具,助你快速复现现网执行计划
前言
计划生成问题的处理依赖于对应环境,而在本地复现现网的计划生成问题时,主要有两个困难:
- 需要在本地以1:1的比例创建客户集群的镜像集群(DN 的数量相同)。若客户集群的节点数很多,则很难在本地创建镜像集群。
- 由于无法获取客户数据,因此需要手动构造数据。很难构造出能够准确复现问题的数据。
为了解决上述的两个困难,需要收集一些现场信息来辅助复现问题,这些信息包括:
- 查询对象(表、视图、索引、函数、命名空间)的定义
- 所需的统计信息(pg_class、pg_statistic、pg_statistic_ext)
- 影响计划复现的配置参数
- 节点信息和node group信息
- 数据库信息(数据库编码、数据库兼容性)
GaussDB(DWS)提供了一个在本地快速复现现网计划生成问题的解决方案:将现场信息导出的功能集成在内核中,在客户现场,通过客户端执行 SQL 语句的方式使用现场信息导出功能,然后将导出的现场信息发送回本地,在本地执行导入脚本,将现场信息导入本地的集群中,就可以在该集群中复现问题了。
该解决方案既避免了创建镜像集群和手动构造数据,又不需要登录客户的服务器,使用方便且适用面广,为维护工作和定位问题提供了便利。
如何使用?
1. 预置条件
预设现场环境如下:
CREATE TABLE t1(c1 int, c2 timestamp) DISTRIBUTE BY HASH(c1);
INSERT INTO t1 VALUES( generate_series(1,10), sysdate);
ANALYZE t1;
2. 执行概述
为EXPLAIN关键字新增语法选项STATS,用于导出现场信息。
执行 EXPLAIN (STATS ON) xxx 语句(xxx即为现场执行报错语句)后,获取复现所需的现场信息,此时将导出的现场信息作为输入,以 SQL 语句的形式执行,从而将现场信息导入本地集群。
以上述预置条件为例,假设现场执行查询SELECT * FROM t1
时,出现错误,则通过本文所述特性,获取复现当前环境所需信息的 SQL 语句如下。
EXPLAIN (STATS ON)
SELECT * FROM t1;
3. 结果说明
执行上述导出语句后,得到以下信息:
3.1 查询对象的定义
--@ query objects
-- Create namespace query objects
-- Create function query objects
-- Create sequence query objects
-- Create table query objects
-- Create table "t1"
DROP TABLE IF EXISTS "public"."t1";
SET search_path = public;
CREATE TABLE t1 (
c1 integer,
c2 timestamp without time zone
)
WITH (orientation=row, compression=no)
DISTRIBUTE BY HASH(c1);
-- Create view query objects
--@@ query objects
对于查询对象的定义信息导出,主要针对 表、视图、索引、函数以及命名空间 信息进行导出。
3.2 所需的统计信息
--@ statistics
-- Import "pg_class_tmp"
SET search_path = "public";
COPY "pg_class_tmp" FROM stdin DELIMITER ',';
public,t1,4,10,0
\.
-- Import "pg_statistic_tmp"
SET search_path = "public";
COPY "pg_statistic_tmp" FROM stdin DELIMITER ',';
public,t1,pg_catalog,int4,c,1,f,0,4,-1,2,3,0,0,0,97,97,0,0,0,\N,{.527273},\N,\N,\N,{1\,2\,3\,4\,5\,6\,7\,8\,9\,10},\N,\N,\N,\N,-1
public,t1,pg_catalog,timestamp,c,2,f,0,8,1,1,3,0,0,0,2060,2062,0,0,0,{1},{1},\N,\N,\N,{"2022-04-12 14:24:09"},\N,\N,\N,\N,-.333333
\.
-- Import "pg_statistic_ext_tmp"
SET search_path = "public";
COPY "pg_statistic_ext_tmp" FROM stdin DELIMITER ',';
\.
--@@ statistics
对于所需的统计信息的导出,主要针对 pg_class_tmp 、 pg_statistic_tmp 、pg_statistic_ext_tmp 信息进行导出。
3.3 影响计划复现的配置参数
--@ config options
-- acceleration_with_compute_pool = off
-- agg_redistribute_enhancement = off
-- allocate_mem_cost = 0
-- best_agg_plan = 0
-- cache_tag_value_num = 60000
-- codegen_cost_threshold = 10000
-- codegen_strategy = partial
-- constraint_exclusion = partition
-- cost_model_version = 1
-- cost_param = 16
-- cpu_index_tuple_cost = 0.005
-- cpu_operator_cost = 0.0025
-- cpu_tuple_cost = 0.01
-- cursor_tuple_fraction = 0.1
-- debug_group_dop =
-- default_statistics_target = 100
-- default_storage_nodegroup = installation
-- effective_cache_size = 16384
-- enable_absolute_tablespace = on
-- enable_bitmapscan = on
-- enable_bloom_filter = on
-- enable_broadcast = on
-- enable_change_hjcost = off
-- enable_codegen = on
-- enable_codegen_print = off
-- enable_compress_hll = off
-- enable_compress_spill = on
-- 省略部分输出
--@@ config options
所有配置参数的信息被存放在 guc_variables 数组中,以 config_generic 结构存储,config_generic 的 group 字段指明了该配置参数在哪个功能模块中被使用。
此外,还有一些配置参数虽然没有直接在计划生成阶段被使用,但间接影响了计划的生成,例如兼容性相关的配置参数,这些配置参数也需要被导出。
3.4 节点信息和node group信息
--@ node groups
-- Create nodes
CREATE NODE "datanode1" WITH (type = 'datanode');
CREATE NODE "datanode2" WITH (type = 'datanode');
CREATE NODE "datanode3" WITH (type = 'datanode');
CREATE NODE "datanode4" WITH (type = 'datanode');
-- Create node groups
CREATE NODE GROUP "node_group" WITH (datanode1, datanode2, datanode3, datanode4);
-- Update tables' node groups
UPDATE pgxc_class
SET pgroup = 'node_group'
FROM pg_class JOIN
pg_namespace ON (relnamespace = pg_namespace.oid)
WHERE relname = 't1' AND
nspname = 'public' AND
pg_class.oid = pcrelid;
--@@ node group
扫描 pgxc_node 与 pgxc_group 系统表,获取节点信息与node group信息,然后构造出CREATE语句。
3.5 数据库信息
--@ database
CREATE DATABASE "plan_sim" ENCODING 'UTF8'
LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8' DBCOMPATIBILITY 'ORA';
\c "plan_sim"
--@@ database
扫描 pg_database 系统表,获取数据库信息,然后构造出 CREATE 语句并输出。
总结
本文主要对“一键式现场信息收集工具”特性进行说明,通过对EXPLAIN关键字新增STATS选项,实现对复现现场场景所需信息的收集导出,并以此导出信息作为输入,以SQL语句的形式,执行后将现场信息导入本地集群。
- 点赞
- 收藏
- 关注作者
评论(0)