有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入。其中数据源通常是一个或多个大文件,这个过程有时可能非常慢。

造成性能不佳的原因有很多:索引、触发器、外键、GUID 主键,甚至预写日志 (WAL) 都可能导致延迟。

在本文中,我们将介绍一些将数据大容量导入KingbaseES数据库的最佳实践技巧。但是,在某些情况下,这些可能都不是有效的解决方案。我们建议读者在应用之前考虑任何方法的优缺点。

技巧 1:将目标表更改为UNLOGGED模式

在KingbaseES数据库中,可以先将目标表更改为 UNLOG,然后在加载数据后更改回 LOGGED:

ALTER TABLE <target table> SET UNLOGGED;
<bulk data insert operations…>
ALTER TABLE <target table> LOGGED;

UNLOGGED模式可确保 KingbaseES不会将表写入操作发送到预写日志 (WAL),这可以使加载过程明显加快。但是,由于不记录操作,因此如果在加载期间服务器崩溃或不干净,则无法恢复数据。KingbaseES将在重新启动后自动截断任何未记录的表。

此外,未记录的表不会复制到备用服务器。在这种情况下,必须在加载之前删除现有复制,并在加载后重新创建现有复制。根据主节点中的数据量和备用节点的数量,重新创建复制的时间可能很长,并且高可用集群是无法接受的。

对于将数据大容量插入到UNLOGGED的表中,我们建议采用以下最佳做法:

  • 在将表和数据更改为未记录模式之前,对其进行备份
  • 在数据加载完成后,重新创建到备用服务器的任何复制
  • 对可以轻松重新填充的表,使用UNLOGGED的批量插入(例如,大型查找表或维度表)

技巧 2:删除和重新创建索引

现有索引可能会在批量数据插入期间导致显著延迟。这是因为在添加每行时,还必须更新相应的索引条目。

我们建议在开始大容量插入之前尽可能删除目标表中的索引,并在加载完成后重新创建索引。同样,在大型表上创建索引可能非常耗时,但通常比在加载期间更新索引更快。

DROP INDEX <index_name1>, <index_name2> … <index_name_n>;
<bulk data insert operations…>
CREATE INDEX <index_name> ON <target_table>(column1, …,column n);

在创建索引之前,暂时增加maintenance_work_mem配置参数可能是值得的。增加的工作内存可以帮助更快地创建索引。

另一个安全的选项是,使用现有数据和索引,在同一数据库中复制目标表。然后,可以使用大容量插入对这个新复制的表进行测试,适用于以下两种方案:删除并重新创建索引,或动态更新索引。然后,可以对实时表采用产生更好性能的方法。

技巧 3:删除并重新创建外键

与索引一样,外键约束也会影响大容量加载性能。这是因为必须检查每个插入行中的每个外键,是否存在相应的主键。在后台,KingbaseES使用触发器来执行检查。加载大量行时,必须为每行触发此触发器,这会增加开销。

除非受到业务规则的限制,否则我们建议从目标表中删除所有外键,将数据加载到单个事务中,然后在提交事务后,重新创建外键。

ALTER TABLE <target_table>
DROP CONSTRAINT <foreign_key_constraint>; BEGIN TRANSACTION
<bulk data insert operations…>
COMMIT; ALTER TABLE <target_table>
ADD CONSTRAINT <foreign key constraint>
FOREIGN KEY (<foreign_key_field>)
REFERENCES <parent_table>(<primary key field>)...;

同样,增加maintenance_work_mem配置参数可以提高重新创建外键约束的性能。

技巧 4:禁用触发器

INSERT 或 DELETE 触发器(如果加载过程还涉及从目标表中删除记录)可能会导致批量数据加载延迟。这是因为每个触发器都有需要检查的逻辑,并且每行之后需要立即完成的操作将被 INSERTed 或 DELETEEd 选中。

我们建议在大容量加载数据之前禁用目标表中的所有触发器,并在加载完成后启用它们。禁用 ALL 触发器,还包括强制执行外键约束检查的系统触发器。

ALTER TABLE <target table> DISABLE TRIGGER ALL ;
<bulk data insert operations…>
ALTER TABLE <target table> ENABLE TRIGGER ALL ;

技巧 5:使用 COPY 命令

我们建议使用 KingbaseES的COPY 命令,从一个或多个文件加载数据。COPY 针对大容量数据加载进行了优化。它比运行大量 INSERT 语句,甚至多值 INSERT 更有效。

COPY <target table> [( column1>, … , <column_n>)]
FROM '<file_name_and_path>'
WITH (<option1>, <option2>, … , <option_n>)

使用 COPY 的其他好处包括:

  • 支持文本和二进制文件导入
  • 本质上是事务性的
  • 允许指定输入文件的结构
  • 可以使用 WHERE 子句有条件地加载数据

技巧 6:使用多值 INSERT

对于批量数据加载,运行数千或数十万个 INSERT 语句可能是一个糟糕的选择。这是因为每个单独的 INSERT 命令都必须由查询优化器解析和准备,完成所有约束检查,作为单独的事务运行,并记录在 WAL 中。使用多值单个 INSERT 语句可以节省此开销。

INSERT INTO <target_table> (<column1>, <column2>, …, <column_n>)
VALUES
(<value a>, <value b>, …, <value x>),
(<value 1>, <value 2>, …, <value n>),
(<value A>, <value B>, …, <value Z>),
(<value i>, <value ii>, …, <value L>),
...

多值 INSERT 性能受现有索引的影响。建议在运行命令之前删除索引,并在之后重新创建索引。

另一个需要注意的领域是KingbaseES可用于运行多值INSERT的内存量。运行多值 INSERT 时,RAM 中必须容纳大量输入值,除非有足够的可用内存,否则该过程可能会失败。

我们建议将effective_cache_size参数设置为系统内存的50%,并将shared_buffer参数设置为计算机总 RAM 的 25%。此外,为了安全起见,它运行一系列多值 INSERT,每个语句的值为 1000 行。

技巧 7:运行分析

这与提高批量数据导入性能无关,但我们强烈建议在大容量导入后,立即对目标表运行 ANALYZE 命令。大量新行将显著扭曲列中的数据分布,并导致表上的任何现有统计信息都已过期。当查询优化器使用陈旧的统计信息时,查询性能可能非常差,令人无法接受。运行 ANALYZE 命令将确保更新任何现有统计信息。

最后的思考

对于数据库应用程序,批量数据导入可能不会每天发生,但查询运行时会对性能产生影响。这就是为什么有必要尽可能缩短加载时间的原因。为了最大限度地减少任何意外,DBA可以做的一件事是在具有类似服务器规范和KingbaseES配置的开发或过渡环境中测试负载优化。每个数据加载方案都是不同的,最好尝试每种方法并找到有效的方法。

KingbaseES批量数据加载的实践技巧的更多相关文章

  1. 使用 ExecuteMultiple 提高批量数据加载的性能

    您可以使用 ExecuteMultipleRequest 消息在 Microsoft Dynamics CRM Online 2016 Update 和 Microsoft Dynamics CRM ...

  2. [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader

    [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 目录 [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 0x00 摘要 0x01 ...

  3. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  4. APP中数据加载的6种方式-b

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  5. hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存

    QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...

  6. JQuery 之 在数据加载完成后才自动执行函数

    数据加载完成执行: $(window).load(function(){ ... }); 进入页就执行,不论等数据是否加载完成: $(document).ready(function(){ ... } ...

  7. GreenPlum数据加载

    1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行 ...

  8. PyTorch 数据集类 和 数据加载类 的一些尝试

    最近在学习PyTorch,  但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自己对此做了一些小实 ...

  9. App6种常见的数据加载设计

    App6种常见的数据加载设计 设计师在进行APP设计的设计时,往往会更加专注于界面长什么样,界面和界面之间怎么跳转,给予用户什么样的操作反馈,却偏偏特别容易忽略掉一个比较重要的环节,就是APP数据加载 ...

随机推荐

  1. 自己实现一个自定义React项目脚手架「ReactCli」

    前言 首先为什么想到自己实现一个React脚手架呢?是因为之前刚接触create-react-app时,觉得不太灵活.虽然文件目录很清晰,但是还是觉得不如VueCLI的可以自定义配置更加灵活.当然Re ...

  2. Node.js精进(5)——HTTP

    HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种获取网络资源(例如图像.HTML文档)的应用层协议,它是互联网数据通信的基础,由请求和响应构成. 在 Node ...

  3. jenkins结合ansible发布

    1. yum安装的jenkins修改配置文件调用ansible vim /etc/sysconfig/jenkins 2. 安装Jenkins Ansible插件 Manage Jenkins---& ...

  4. VisionPro · C# · 创建项目

    将 VisionPro 引入 C# 项目程序中需要执行以下操作: 1.更改项目程序.NET框架: 2.添加编程引用: 3.添加界面设计控件引用: VisionPro 不同版本对应不同的 .NET 框架 ...

  5. ssh-配置及使用

    ssh配置文件 SSH的配置文件在/etc/ssh/目录下     openssh-client安装后,生成的配置文件为ssh_config,主要用于连接其他linux主机时,加载此文件     op ...

  6. 零基础学Java(1)初识Java程序

    前言 就国内来说,Java毫无疑问是后端语言中的No.1没有之一,所以今天我们也来0基础学习Java!!! Java的好处(针对测试工程师) 面试加分->涨薪 大多数公司服务端用的都是Java, ...

  7. TypeScript 接口继承

    1.TypeScript 接口继承 和类一样,接口也可以通过关键字 extents 相互继承.接口继承,分为:单继承和多继承,即继承多个接口.另外,接口也可以继承类,它会继承类的成员,但不包括具体的实 ...

  8. Solution -「营业」「CF567D」One-Dimensional Battle Ships

    题目大意 - 翻译   Alice 和 Bob喜欢在 \(1\times n\) 的表格中玩战舰游戏.游戏开始时,Alice 有 \(k\) 艘战舰,每艘战舰长度为 \(a\),她需要把这些战舰不重叠 ...

  9. 可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)

    前言 在开发中,随着业务逻辑的调整,修改存储过程是必不可免的. 那怎么定位到需要修改的存储过程呢?一个一个的点开查询?存储过程少的话还行,一旦存储过程过多,这样是很浪费时间的,一个不注意还会遗漏掉. ...

  10. HBase学习(四) 二级索引 rowkey设计

    HBase学习(四) 一.HBase的读写流程 画出架构 1.1 HBase读流程 Hbase读取数据的流程:1)是由客户端发起读取数据的请求,首先会与zookeeper建立连接2)从zookeepe ...