前言

本文讨论在KingbaseES数据库服务器中批量加载数据的方法,以及空数据库中的初始数据加载和增量数据加载的最佳做法。

批量加载方法

以下数据加载方法按照从最耗时到最不耗时的顺序排列:

1.运行单记录 INSERT 命令。

2.在每次提交中分批成 100 到 1000 行。可以使用事务块在每次提交时包含多条记录。

3.运行INSERT命令,使用多个行的value值。

4.运行 COPY 命令。

将数据加载到数据库的首选方法是使用 COPY 命令。如果无法使用 COPY 命令,则使用分批提交处理 INSERT 是次优方法。

另外使用 COPY 命令进行多线程处理是批量加载数据的最佳方法。

初始数据加载的最佳做法

删除索引

在执行初始数据加载之前,建议删除表中的所有索引。在加载数据后创建索引,这样加载速度更快。

删除约束

下面描述了有关删除约束:

唯一键约束

建议在执行初始数据加载之前删除唯一键约束,并在数据加载完成后重新创建这些约束。但是删除唯一键约束会引发重复数据。

外键约束

建议执行初始数据加载之前删除外键约束,并在数据加载完成后重新创建这些约束。

将session_replication_role参数更改为replica也会禁用所有外键。注意,如果使用不当,进行更改可能会导致数据处于不一致状态。

无日志记录表

在初始数据加载中使用无日志记录表之前,考虑使用此类表的优点和缺点。

优点:

使用无日志记录表可以加快数据加载速度。写入无日志记录表的数据不会写入预写日志。

缺点:

数据库崩溃时不安全。发生崩溃或者执行不彻底的关机后,无日志记录表将被自动截断,无法恢复。

无日志记录表中的数据无法复制到备用服务器。

使用以下语法创建新的无日志记录表:

CREATE UNLOGGED TABLE <tablename>;

使用以下语法将现有日志记录表转换为无日志记录表:

ALTER TABLE <tablename> SET UNLOGGED;

服务器参数优化

autovacuum:在初始数据加载期间,最好关闭 autovacuum进程,初始加载完成后,建议对数据库中的所有表手动运行VACUUM ANALYZE,然后打开autovacuum进程。

备注:

请仅在内存和磁盘空间足够时遵循以下的建议。

maintenance_work_mem:建议在数据库服务器上设置为2GB。

maintenance_work_mem有助于加快autovacuum,索引和外键的创建。

checkpoint_timeout:在数据库服务器上,可将checkpoint_timeout值从默认设置5分钟增加到最大24小时。建议最初在灵活服务器上加载数据之前将该值增加到1小时。

最终生产上设置多大值需要结合业务上dml操作的频繁度,在安全和性能之间权衡。

checkpoint_completion_target:建议设置为值0.9。

max_wal_size:可设置为允许的最大值(执行初始数据加载时设置为64 GB)。

在业务高峰期,该参数通过以下方法得出一个合理值:

a. 运行以下查询获取当前的WAL日志序列号(LSN):

SELECT sys_current_wal_lsn ();

b. 等待checkpoint_timeout的秒数。运行以下查询获取当前的WAL LSN:

SELECT sys_current_wal_lsn ();

c. 使用这两个结果来检查差异(以 GB 为单位):

SELECT round (sys_wal_lsn_diff('LSN value when run second time','LSN value when run first time')/1024/1024/1024,2) WAL_CHANGE_GB;

wal_compression:可以打开。启用此参数可能会导致WAL日志记录期间的压缩和WAL日志重放期间的解压缩产生一些额外的CPU成本。

推荐

在数据库上开始初始数据加载之前建议:

在服务器上禁用高可主备流复制。在主库上完成初始加载后,再启用流复制。

在初始数据加载期间尽量减少日志记录量或完全禁用它(例如:禁用pgaudit、sys_stat_statements)。

加载数据后重新创建索引并添加约束

可以修改以下参数,在初始数据加载后更快地创建并行索引:

max_parallel_workers:可为并行查询提供的最大工作进程数。

max_parallel_maintenance_workers:控制可在CREATE INDEX中使用的最大工作进程数。

还可以通过在会话级别设置创建索引。 以下示例演示如何执行此操作:

SET maintenance_work_mem = '2GB';
SET max_parallel_workers = 16;
SET max_parallel_maintenance_workers = 8;
CREATE INDEX test_index ON test_table(test_column);

增量数据加载的最佳做法

将表分区

建议将大型表分区(尤其是千万行以上的大表)。 分区的一些优点(尤其是在增量加载期间)包括:

1.基于新增量数据创建新分区可以更高效地将新数据添加到表中。

2.为了表的维护更容易,可以在增量数据加载期间删除分区,以避免在大型表维护中进行耗时的删除。

3.仅增量加载期间更改或添加的分区上会触发Autovacuum,这使得可以更轻松地维护表中的统计信息。监视和维护表统计信息准确对于数据库的查询性能至关重要。

基于外键约束创建索引

以下情况下,在子表中基于外键创建索引可能有好处:

在父表中更新或删除数据。在父表中更新或删除数据时,将对子表执行查找,为加快查找速度,可以对子表的外键进行索引。

父表和子表的联接出现在键列上的查询。

识别未使用的索引

识别数据库中未使用的索引并删除。索引是数据加载的开销。表中的索引越少,数据加载期间的性能就越好。

索引使用情况

使用以下查询来识别未使用的索引:

SELECT
t.schemaname,
t.tablename,
c.reltuples::bigint AS num_rows,
sys_size_pretty(sys_relation_size(c.oid)) AS table_size,
ps.indexrelname AS index_name,
sys_size_pretty(sys_relation_size(i.indexrelid)) AS index_size,
CASE WHEN i.indisunique THEN 'Y' ELSE 'N' END AS "unique",
ps.idx_scan AS idx_number_of_scans,
ps.idx_tup_read AS idx_tuples_read,
ps.idx_tup_fetch AS idx_tuples_fetched
FROM
sys_tables t
LEFT JOIN sys_class c ON t.tablename = c.relname
LEFT JOIN sys_index i ON c.oid = i.indrelid
LEFT JOIN sys_stat_all_indexes ps ON i.indexrelid = ps.indexrelid
WHERE
t.schemaname NOT IN ('sys_catalog','pg_catalog','information_schema')
ORDER BY 1, 2;
idx_number_of_scans、idx_tuples_read 和 idx_tuples_fetched 列将指示索引使用情况。idx_number_of_scans 列值为零表示未使用的索引。

KingbaseES数据库批量加载数据的最佳方法的更多相关文章

  1. Android学习笔记_37_ListView批量加载数据和页脚设置

    1.在activity_main.xml布局文件中加入ListView控件: <RelativeLayout xmlns:android="http://schemas.android ...

  2. OGG初始化之使用数据库实用程序加载数据

    Loading Data with a Database Utility 要使用数据库复制实用程序建立目标数据,您需要启动更改同步提取组,以便在数据库实用程序创建并应用数据的静态副本时提取正在进行的数 ...

  3. android 批量加载数据

    public class MainActivity extends Activity { private ListView listView; private List<String> d ...

  4. 【HBase】通过Bulkload批量加载数据到Hbase表中

    目录 需求 步骤 一.开发MapReduce 二.打成Jar包放到linux执行 三.有两种办法将HFile文件加载到HBase表中 开发代码 Hadoop命令运行 需求 将hdfs上面的这个路径 / ...

  5. java多线程向数据库中加载数据

    读取本地文件,每行为一条记录,文件大小550M,200万条数据.先将文件读取的内存中,再开启6个线程连接postgresql不同coordinator端口导入数据.代码如下: import java. ...

  6. DHTMLX 前端框架 建立你的一个应用程序 教程(六)-- 表格加载数据

    从数据库加载数据 这篇我们介绍从MySQL数据库中加载数据到表格 我们使用 MySql的数据库dhtmlx_tutorial 和表contacts 示例使用的是PHP平台和dhtmlxConnecto ...

  7. 时间序列数据库——索引用ES、聚合分析时加载数据用什么?docvalues的列存储貌似更优优势一些

    加载 如何利用索引和主存储,是一种两难的选择. 选择不使用索引,只使用主存储:除非查询的字段就是主存储的排序字段,否则就需要顺序扫描整个主存储. 选择使用索引,然后用找到的row id去主存储加载数据 ...

  8. Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...

  9. 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式

    1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具   本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...

  10. SQLAlchemy加载数据到数据库

    SQLAlchemy加载数据到数据库 最近在研究基于知识图谱的问答系统,想要参考网上分享的关于NLPCC 2016 KBQA任务的经验帖,自己实现一个原型.不少博客都有提到,nlpcc-kbqa训练数 ...

随机推荐

  1. Direct2D 旋转篇

    微软文档:Transforms 本篇通过官方文档学习,整理出来的demo,初始样本请先创建一个普通的desktop app. ID2D1SolidColorBrush* m_pOriginalShap ...

  2. 【LeetCode字符串#04】左旋转字符串,以及反转函数使用说明

    左旋转字符串 力扣题目链接(opens new window) 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"a ...

  3. 【Azure 应用服务】Python Function App重新部署后,出现 Azure Functions runtime is unreachable 错误

    问题描述 Python Function App重新部署后,出现 Azure Functions runtime is unreachable 错误 问题解答 在Function App的门户页面中, ...

  4. 【Azure 应用服务】在安全漏洞扫描中发现有泄露服务器IIS版本的情况,如何实现屏蔽服务版本号信息呢?

    问题描述 当对Azure App Service应用进行安全扫描时,发现了HTTP/S请求的响应头中会包含服务端IIS的版本信息,这是一个低风险因素. 如: Server: Microsoft-IIS ...

  5. 当 GraphQL 遇上图数据库,便有了更方便查询数据的方式

    人之初,性本鸽. 大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00 后一枚.目前从事后端开发工作. 今天给大家带来一个简单的为 NebulaGraph 提供 GraphQL 查询支持的 DEMO ...

  6. 基于Ant Design设计语言的WinForm UI界面库

    前言 经常在技术群里看到有小伙伴提问:WinForm有什么好看.开源的UI库推荐的吗?,今天大姚给大家分享一款基于Ant Design(使用Ant Design 5.0)设计语言.开源(Apache ...

  7. Java 常用类 String类与其他结构之间的转换-----String 与 byte[]之间的转换

    1 /** 2 * 3 * String 与 byte[]之间的转换 4 * 编码:String ---> byte[]:调用String的getBytes() 5 * 解码:byte[]--- ...

  8. Python魔法:20个让你编程事半功倍的奇淫技巧(建议收藏)

    Python作为一门灵活.充满技巧的语言,有着很多奇技淫巧,今天小编就跟大家分享一下在平时工作中所积累的技巧,这里面既有语法上的技巧,也有库函数的应用,可以帮助大家在平时的工作中提升效率,规避某些错误 ...

  9. 3 - 任务调度算法 & 同步与互斥 &队列

    之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行 怎样才能讲道理呢?稍微等等嘛,等我做完活你再做   1 支持抢占,0不支持抢占  同优先级任务是否交替 ...

  10. Redis持久化之RDB(Redis DataBase) 和 AOF(Append Only File)

    Redis提供了两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File). 1. RDB持久化: RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁 ...