GBase 8a的global hash索引参数key_dc_size导致加载耗时波动

本文介绍在GBase8a数据库集群中使用globalHash索引时,通过调整key_dc_size参数来减少数据加载过程中的性能抖动现象。在一个三节点集群环境下,通过设置合适的key_dc_size参数值,可以有效避免因数据量变化导致的性能波动。

GBase 8a数据库集群支持global Hash索引,用于精确查询。为了方便释放空间,提供了key_dc_size参数,如果该参数和每次加载的数据量出现匹配,将会很容易出现抖动。

环境

三个节点的集群

[gbase@localhost ~]$ gcadmin
CLUSTER STATE:         ACTIVE
VIRTUAL CLUSTER MODE:  NORMAL

=============================================================
|           GBASE COORDINATOR CLUSTER INFORMATION           |
=============================================================
|   NodeName   | IpAddress  | gcware | gcluster | DataState |
-------------------------------------------------------------
| coordinator1 | 10.0.2.102 |  OPEN  |   OPEN   |     0     |
-------------------------------------------------------------
| coordinator2 | 10.0.2.202 |  OPEN  |   OPEN   |     0     |
-------------------------------------------------------------
| coordinator3 | 10.0.2.203 |  OPEN  |   OPEN   |     0     |
-------------------------------------------------------------
=========================================================================================================
|                                    GBASE DATA CLUSTER INFORMATION                                     |
=========================================================================================================
| NodeName |                IpAddress                 | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node1   |                10.0.2.102                |       3        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
|  node2   |                10.0.2.202                |       3        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
|  node3   |                10.0.2.203                |       3        | OPEN  |    OPEN    |     0     |
-----

测试数据

100万行数据

表结构

CREATE TABLE "t2" (
  "id" int(11) DEFAULT NULL,
  "name" varchar(20) DEFAULT NULL,
  KEY "idx_name" ("name") KEY_BLOCK_SIZE=4096 KEY_DC_SIZE=10 USING HASH GLOBAL
)

key_dc_size参数

key_dc_size=10, 每个DC是66636行, 10个是65万行。 3个节点接近200万行。预计每次加载100万,大约2-3次会出现一次抖动。

运行效果

和预期相符,一次快,一次慢,很有规律。速度快的24-26秒,慢的30-39秒。

gbase> truncate table t2;
Query OK, 10000041 rows affected (Elapsed: 00:00:00.50)

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:22.68)
Task 13378 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:25.56)
Task 13379 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:22.09)
Task 13380 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:29.59)
Task 13381 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:22.81)
Task 13382 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:30.04)
Task 13383 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:26.06)
Task 13384 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:34.11)
Task 13385 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:24.57)
Task 13386 finished, Loaded 1000000 records, Skipped 0 records

gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.202//home/gbase/data/ran.txt' into table t2 fields terminated by ',';
Query OK, 1000000 rows affected (Elapsed: 00:00:39.45)
Task 13387 finished, Loaded 1000000 records, Skipped 0 records

建议

key_dc_size参数,建议设置为每天或每半天数据量的计算值。简单公式

每天行数/节点数/65536, 然后取整即可。

如果是天表,那就不用了。

 

参考老紫竹的家 https://www.gbase8.cn/1714

 
### GBase 8a 中 tables_fields 加载参数的语法错误解决方案 在 GBase 8a 数据库中,`tables_fields` 参数通常用于指定表字段的相关信息。如果在加载数据时出现语法错误,可能是由于以下几个常见原因导致的:参数格式不正确、字段与实际表结构不匹配或缺少必要的全局配置[^1]。 #### 全局变量检查 首先需要确保 GBase 8a 的全局变量已正确设置以支持数据加载操作。可以通过以下命令检查和调整相关变量: ```sql gbase> show variables like '%load%'; gbase> set global gbase_loader_read_timeout = 10000; gbase> set global gcluster_loader_max_data_processors = 4; ``` 这些变量分别控制加载超时时间和数据处理器的最大数量。如果未正确设置这些变量,可能会导致加载失败或语法错误[^1]。 #### tables_fields 参数的正确使用 `tables_fields` 参数主要用于指定目标表中的字段列表及其格式。以下是正确的语法示例: ```sql LOAD DATA INFILE 'data.csv' INTO TABLE my_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1, field2, field3); ``` 在上述语句中: - `FIELDS TERMINATED BY ','` 指定了字段分隔符为逗号。 - `LINES TERMINATED BY '\n'` 指定了行结束符为换行符。 - `(field1, field2, field3)` 列出了目标表中的字段名称,必须与表结构严格匹配[^1]。 #### 常见语法错误及解决方法 1. **字段顺序错误**:确保 `tables_fields` 中列出的字段顺序与目标表定义一致。如果字段顺序不匹配,会导致插入失败。 2. **字段类型不匹配**:检查数据文件中的值是否符合目标字段的数据类型。例如,字符串字段可能需要额外的引号包裹。 3. **缺失字段**:如果目标表中有非空字段未在 `tables_fields` 中指定,将导致语法错误。可以使用默认值或显式指定所有字段。 4. **特殊字符问题**:如果数据文件中包含特殊字符(如换行符或引号),需确保正确转义或使用适当的分隔符[^1]。 #### 示例代码 以下是一个完整的加载数据示例,展示了如何正确使用 `tables_fields` 参数: ```sql -- 设置全局变量 set global gbase_loader_read_timeout = 10000; set global gcluster_loader_max_data_processors = 4; -- 加载数据 LOAD DATA INFILE '/path/to/data.csv' INTO TABLE my_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1, field2, field3); ``` #### 注意事项 - 确保数据文件路径对数据库用户可访问。 - 如果数据文件较大,可以调整 `gcluster_loader_max_data_processors` 的值以提高加载性能。 - 使用 `SHOW WARNINGS` 命令查看加载过程中产生的警告信息,有助于定位潜在问题[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值