KingbaseES数据库批量加载数据的最佳方法
前言
本文讨论在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数据库批量加载数据的最佳方法的更多相关文章
- Android学习笔记_37_ListView批量加载数据和页脚设置
1.在activity_main.xml布局文件中加入ListView控件: <RelativeLayout xmlns:android="http://schemas.android ...
- OGG初始化之使用数据库实用程序加载数据
Loading Data with a Database Utility 要使用数据库复制实用程序建立目标数据,您需要启动更改同步提取组,以便在数据库实用程序创建并应用数据的静态副本时提取正在进行的数 ...
- android 批量加载数据
public class MainActivity extends Activity { private ListView listView; private List<String> d ...
- 【HBase】通过Bulkload批量加载数据到Hbase表中
目录 需求 步骤 一.开发MapReduce 二.打成Jar包放到linux执行 三.有两种办法将HFile文件加载到HBase表中 开发代码 Hadoop命令运行 需求 将hdfs上面的这个路径 / ...
- java多线程向数据库中加载数据
读取本地文件,每行为一条记录,文件大小550M,200万条数据.先将文件读取的内存中,再开启6个线程连接postgresql不同coordinator端口导入数据.代码如下: import java. ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(六)-- 表格加载数据
从数据库加载数据 这篇我们介绍从MySQL数据库中加载数据到表格 我们使用 MySql的数据库dhtmlx_tutorial 和表contacts 示例使用的是PHP平台和dhtmlxConnecto ...
- 时间序列数据库——索引用ES、聚合分析时加载数据用什么?docvalues的列存储貌似更优优势一些
加载 如何利用索引和主存储,是一种两难的选择. 选择不使用索引,只使用主存储:除非查询的字段就是主存储的排序字段,否则就需要顺序扫描整个主存储. 选择使用索引,然后用找到的row id去主存储加载数据 ...
- Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)
最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...
- 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式
1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具 本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...
- SQLAlchemy加载数据到数据库
SQLAlchemy加载数据到数据库 最近在研究基于知识图谱的问答系统,想要参考网上分享的关于NLPCC 2016 KBQA任务的经验帖,自己实现一个原型.不少博客都有提到,nlpcc-kbqa训练数 ...
随机推荐
- 【Unity3D】MonoBehaviour的生命周期
1 前言 Unity3D 中可以给每个游戏对象添加脚本,这些脚本必须继承 MonoBehaviour,用户可以根据需要重写 MonoBehaviour 的部分生命周期函数,这些生命周期函数由系统自 ...
- 大米新闻微信小程序和Springboot新闻管理系统项目源码
介绍 本项目分为大米news小程序端和springboot新闻管理系统后台项目.小程序主要用来新闻展示,后台管理系统用于提供相关新闻API. 项目源码 参考:https://www.bilibili. ...
- 两台redhat7虚拟机配置ssh免密访问
说明 有时候为了方便搭建各种集群环境,需要配置多台虚拟机之间可以互相免密码访问.本文就介绍一下这个知识点,希望所帮助的朋友给老徐点个赞:) 两台虚拟机环境配置如下: 虚拟机1:192.168.56.1 ...
- 责任链模式与spring容器的搭配应用
背景 有个需求,原先只涉及到一种A情况设备的筛选,每次筛选会经过多个流程,比如先a功能,a功能通过再筛选b功能,然后再筛选c功能,以此类推.现在新增了另外一种B情况的筛选,B情况同样需要A情况的筛选流 ...
- UTF-8 的理解
举个简单的例子: Unicode 只是一个业界标准,具体一个字符占多少字节,取决于编码方式,包括 UTF-8 UTF-16 GB2312 等 "汉" 在 UTF-8 中占到 3 个 ...
- Direct2D CreateBitmap的使用
当需要设置位图的混合模式时,应该使用ID2D1DeviceContext而不是ID2D1RenderTarget. 代码如下: #define WIN32_LEAN_AND_MEAN #include ...
- virtualapp启动流程源码分析
virtualapp启动流程分析 1. 首先是启动本身,执行Vpp 的attachBaseContext @Override protected void attachBaseContext(Cont ...
- 混合类Mixins介绍
介绍 混合类是封装了一些通用行为的基类,旨在重用代码.通常,混合类本身并没有什么用,仅扩展这种类也行不通 因为在大多数情况下,它都依赖于其它类中定义的方法和属性.通过多继承,可将混合类与其它类一起使用 ...
- offline RL | 读读 Decision Transformer
论文标题:Decision Transformer: Reinforcement Learning via Sequence Modeling,NeurIPS 2021,6 6 7 9 poster( ...
- 【Azure Webjob + Redis】WebJob一直链接Azure Redis一直报错 Timeout Exception
问题描述 运行在App Service上的Webjob连接Azure Redis出现Timeout Exception. 错误截图: 参考Azure Redis对于超时问题的排查建议, 在修改Min ...