我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL中怎么批量导入数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL中怎么批量导入数据

这篇文章将为大家详细讲解有关PostgreSQL中怎么批量导入数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

概述

考虑PostgreSQL数据库批量导入数据时性能缓慢的原因,无非有几个因素:索引,触发器,外键,GUID主键,还有可能是预写日志(WAL)。我们就从这几个影响因素着手优化。当然有可能,本文说的这些技巧都不能有效问题,遇到这样的问题时候,就需要我们具体问题具体分析,并针对性的解决。

关闭日志记录

对于PostgreSQL 9.5及更高版本,可以先将目标表更改为UNLOGGED,然后在加载数据后将其更改回LOGGED:

ALTER TABLE <target table> SET UNLOGGED <批量导入数据&hellip;> ALTER TABLE <target table> LOGGED

UNLOGGED模式可以确保PostgreSQL不会在变量导入数据时将表写操作记录到预写日志(WAL),从而极大的优化导入过程。但是,由于未记录操作,因此如果在加载过程中发生崩溃或服务器关机等故障,则无法恢复数据。PostgreSQL重新启动后将自动截断任何未记录的表。

PostgreSQL中怎么批量导入数据

另外,未记录的表不会复制到备用服务器。在这种情况下,必须在加载之前删除现有的复制,并在加载之后重新创建。根据主节点中的数据量和备用数据库的数量,重建复制的时间可能会很长,对于高可用性要求来说这是不可接受的。

建议采用以下方法,将数据批量插入未记录的表中:

  • 在将表和数据更改为未记录模式之前对其进行备份;

  • 数据加载完成后,重新创建对备用服务器的任何复制;

对可以轻松重新填充的表使用UNLOGGED的批量插入(例如,大型查找表或维度表)。

删除索引

数据库索引可能在批量数据插入期间导致严重的延迟。因为添加数据过程,对应的索引条目需要实时更新。

建议在开始批量插入之前尽可能删除目标表中的索引,并在导入完成后重新创建索引。同样,在大型表上创建索引可能很耗时,但是比在加载过程中更新索引要快。

DROP INDEX <index_name1>, <index_name2> &hellip; <index_name_n> <批量导入数据&hellip;> CREATE INDEX <index_name> ON <target_table>(column1, &hellip;,column n)

创建索引之前,临时提高maintenance_work_mem配置参数可能会有帮助。增加的工作内存可以帮助更快地创建索引。

为了安全起见的另一种选择是使用现有数据和索引在同一数据库中复制目标表。然后,测试有索引和删除索两种情况下批量导入数据的性能对比,然后根据测试结果选择更好的方法。

删除外键

和索引一样,外键约束也会影响大批量导入的性能。因为导入过程中必须检查插入的每个行数据的每个外键是否存在相应的主键。当批量导入时,必须为每一行触发该触发器检查外键,从而增加了开销。

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

ALTER TABLE <target_table> DROP CONSTRAINT <foreign_key_constraint>   BEGIN TRANSACTION <批量导入数据&hellip;> COMMIT   ALTER TABLE <target_table> ADD CONSTRAINT <foreign key constraint> FOREIGN KEY (<foreign_key_field>) REFERENCES <parent_table>(<primary key field>)...

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

暂停触发器

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

建议在批量导入数据之前禁用目标表中的所有触发器,并在导入完成后再启用它们。禁用所有触发器也会强制执行外键约束检查的系统触发器。

ALTER TABLE <target table> DISABLE TRIGGER ALL <批量导入数据&hellip;> ALTER TABLE <target table> ENABLE TRIGGER ALL

使用多值INSERT

对于成批数据加载,运行数千个或数十万个INSERT语句可能是个糟糕的选择。因为查询优化器必须解析和准备每个单独的INSERT命令,然后进行所有约束检查,作为单独的事务运行并记录日志。而使用多值单个INSERT语句可以节省这些不必要的开支。

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

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

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

建议将设置effective_cache_size参数到50%,并将shared_buffer设为机器的总内存的参数设为25%。为了安全起见,将导入划分为多条的多值INSERT,每个语句的值不要超过1000行。

使用COPY命令

建议使用PostgreSQL  COPY命令从一个或多个文件导入数据。COPY针对批量数据导入会进行额外的优化,比运行大量INSERT语句甚至多值INSERTS的都要快。

COPY <target table> [( column1>, &hellip; , <column_n>)] FROM '<文件路径>' WITH (<option1>, <option2>, &hellip; , <option_n>)

使用COPY的还有很多的优势:

  • 它支持文本和二进制文件导入;

  • 本质上是事务性的;

  • 它允许指定输入文件的结构;

  • 它可以使用WHERE子句有条件地导入数据。

运行ANALYZ

这与提高批量数据导入性能无关,但是强烈建议在批量导入之后立即在目标表上运行ANALYZE命令。大量的新导入的行将大大改变数据表中列中的数据分布,并且会使表的统计信息都过时。当用查询优化器使用过时的统计信息时,查询性能可能会非常慢。运行ANALYZE命令将确保更新统计信息。

PostgreSQL中怎么批量导入数据

关于PostgreSQL中怎么批量导入数据就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL中怎么批量导入数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PostgreSQL中数据批量导入优化方法

在数据迁移过程中,PostgreSQL数据库导入大量数据时候非常缓慢,本文我们就来说说PostgreSQL数据库批量导入数据时的优化方法和策略。

批量导入csv格式数据到postgreSQL

首先创建数据库:create database logs;-- 删除数据库: -- drop database logs;创建数据表创一个表,表结构应该可以完全容纳csv的数据结构。首先csv文件结构大致如下:scv表头名应该与数据库字段名一致。创建数据表如下
批量导入csv格式数据到postgreSQL
2015-06-05

oracle怎么批量导入大量数据

Oracle数据库可以通过多种方式批量导入大量数据,以下是一些常用的方法:SQLLoader工具:SQLLoader是Oracle提供的一个用于高效加载大量数据的工具,可以通过控制文件定义数据的格式和加载规则,然后使用SQL*Loader命
oracle怎么批量导入大量数据
2024-04-16

SQLSERVER怎么大批量导入数据

在SQL Server中,可以使用以下方法进行大批量数据导入:1. 使用BULK INSERT语句:BULK INSERT语句允许从外部数据文件中导入数据到SQL Server表中。首先,确保你的数据文件符合SQL Server的要求(例如
2023-08-18

mysql数据怎么导入postgresql中

以下是将MySQL数据导入到PostgreSQL中的一般步骤:导出MySQL数据:使用mysqldump或其他工具将MySQL数据库中的数据导出为SQL文件。例如:mysqldump -u username -p dbname > da
mysql数据怎么导入postgresql中
2024-04-17

SQL Server怎么批量导入和导出数据

在SQL Server中,可以使用bcp命令行实用程序批量导入和导出数据。以下是一些示例:1. 批量导入数据:使用bcp命令行实用程序将数据从文本文件导入到表中。例如,以下命令将从名为data.txt的文本文件中导入数据到名为dbo.MyT
2023-10-10

服务器怎么批量导入与导出数据

这篇文章主要讲解了“服务器怎么批量导入与导出数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“服务器怎么批量导入与导出数据”吧!在使用IIS7远程桌面时,若有多个服务器需要添加,而逐一进行选
2023-06-05

oracle批量导入数据慢怎么加速

使用并行加载:在导入数据时,可以使用并行加载来提高数据导入的速度。在使用SQL*Loader导入数据时,可以通过设置PARALLEL参数来指定并行加载的级别。在使用PL/SQL程序导入数据时,可以使用并行处理或多线程处理来提高导入速度。使用
oracle批量导入数据慢怎么加速
2024-04-09

django批量导入xml数据

django后台批量导入数据在生产环境中,往往数据不是几条或者几百条,那么举个例子,将公司所有员工员工号或者帐号密码导入进后台,那就不建议你去后台一条条记录去添加了 如何从xml中批量导入svn记录第一步:为数据建立模型@python_2_
2022-06-04

python Django批量导入数据

前言: 这期间有研究了Django网页制作过程中,如何将数据批量导入到数据库中. 这个过程真的是惨不忍睹,犯了很多的低级错误,这会在正文中说到的.再者导入数据用的是py脚本,脚本内容参考至自强学堂--中级教程--数据导入.注:本文主要介绍自
2022-06-04

数据库中怎么批量插入数据

本文小编为大家详细介绍“数据库中怎么批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“数据库中怎么批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。批量插入批量插入使用 executemany(
2023-06-08

编程热搜

目录