标签: bulk

优化 PostgreSQL 中的批量更新性能

在 Ubuntu 12.04 上使用 PG 9.1。

目前,我们在数据库上运行大量 UPDATE 语句最多需要 24 小时,它们的形式如下:

UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
Run Code Online (Sandbox Code Playgroud)

(我们只是覆盖由 ID 标识的对象的字段。)这些值来自外部数据源(尚未在数据库中的表中)。

每个表都有几个索引,没有外键约束。直到最后都没有提交。

导入pg_dump整个数据库的一个需要 2 小时。这似乎是我们应该合理定位的基线。

除了生成以某种方式重建数据集以供 PostgreSQL 重新导入的自定义程序之外,我们是否可以做些什么来使批量 UPDATE 性能更接近导入的性能?(这是一个我们认为日志结构合并树处理得很好的领域,但我们想知道是否可以在 PostgreSQL 中做任何事情。)

一些想法:

  • 删除所有非 ID 索引然后重建?
  • 增加 checkpoint_segments,但这真的有助于维持长期吞吐量吗?
  • 使用这里提到的技术?(将新数据加载为表,然后“合并”在新数据中找不到 ID 的旧数据)

基本上有很多事情要尝试,但我们不确定什么是最有效的,或者我们是否忽略了其他事情。我们将在接下来的几天里进行实验,但我们想我们也会在这里问。

我确实在表上有并发负载,但它是只读的。

postgresql performance bulk update

47
推荐指数
1
解决办法
7万
查看次数

从 postgres 批量删除行的最有效方法

我想知道从 PostgreSQL 中删除大量行的最有效方法是什么,这个过程将是每天重复性任务的一部分,以将数据(插入 + 删除的增量)批量导入表中。可能有数千甚至数百万行要删除。

我有一个主键文件,每行一个。我想到的两个选项与下面的内容一致,但我对 PostgreSQL 的内部结构知之甚少,无法做出最好的明智决定。

  • DELETE使用简单WHERE的主键对文件中的每一行执行查询(或n使用IN()子句分批删除)
  • 使用COPY命令将主键导入到临时表中,然后使用连接从主表中删除

任何建议将不胜感激!

postgresql delete bulk

32
推荐指数
2
解决办法
5万
查看次数

为什么“LOAD DATA INFILE”比普通的 INSERT 语句快?

我读过一篇文章,提到我们可以通过使用该语句实现每秒 60,000 次插入,该LOAD DATA IN FILE语句从 csv 文件中读取并将数据插入到数据库中。

为什么它应该与普通刀片不同?

编辑:
我通过只调用一个INSERT语句来减少往返:

INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
    ,(NULL,2,'some text here2'),(NULL,2,'some text here3')
    .....,(NULL,2,'some text here3000');
Run Code Online (Sandbox Code Playgroud)

那这个呢?

mysql bulk import

22
推荐指数
2
解决办法
4万
查看次数

从带有标题的 CSV 文件创建表格

我正在寻找一种方法来仅根据指定 CSV 的内容生成新的 MySQL 表。我将使用的 CSV 文件具有以下属性;

  • “|” 定界。
  • 第一行指定列名(标题),也是“|” 定界。
  • 列名和顺序不固定。
  • 列数不固定。
  • 文件很大(100 万行/50 列)。

在 Excel 中,这一切都相当简单,但是在 MySQL 中似乎并非如此(Google 运气不佳)。关于我应该看什么的任何建议?

mysql bulk import csv

15
推荐指数
2
解决办法
3万
查看次数

OracleBulkCopy 的具体作用是什么,如何优化其性能?

To summarize the specifics: We need to stage approximately 5 million rows into a vendor (Oracle) database. Everything goes great for batches of 500k rows using OracleBulkCopy (ODP.NET), but when we try to scale up to 5M, the performance starts slowing to a crawl once it hits the 1M mark, gets progressively slower as more rows are loaded, and eventually times out after 3 hours or so.

I suspect it's related to a primary key on the table, but I've …

oracle bulk

14
推荐指数
1
解决办法
1万
查看次数

以最少的停机时间重新导入大量数据的最佳方法

我需要每周导入大约 500,000 条包含 IP 查找(只读参考)数据的记录(只有三个 int/bigint cols)。

我真的不想担心将数据与现有表合并,我更愿意清除旧表并重新导入。

理想情况下,运行在数据上的查询将继续运行(我们没有得到很多这样的查询,它们在导入时运行得慢一点是可以接受的,但需要 24/7,所以运行这个“非工作时间”不是一种选择)。

到目前为止尝试过的事情

SSIS:我创建了一个 SSIS 包来截断表和导入 - 运行大约需要 30 秒(真的太长了)。

临时表:导入临时表、截断和复制也需要大约 30 秒。

BCP:批量导入也太慢了(出于某种原因,它比 SSIS 慢(即使没有要维护的索引)-我猜这与 char->int/bigint 事务有关:/

镜台?所以,目前,我想知道如何通过视图读取表,将数据导入镜像表,并更改视图以指向该表......这看起来会很快,但看起来很小对我来说有点hacky。

这似乎应该是一个常见问题,但我找不到推荐的做法 - 任何想法都将不胜感激!

谢谢

sql-server bulk import

11
推荐指数
1
解决办法
2819
查看次数

我应该在进行批量更新时禁用表上的自动清理吗?

我需要对表中的所有行执行简单的更新。该表有 40-50 百万行。在此期间删除索引和约束会UPDATE导致巨大的性能改进。

但是自动吸尘器呢?autovacuum 可以启动 aVACUUM还是ANALYZE在 a 的中间UPDATE?如果是这样,那会消耗机器资源的无用工作。我可以先在桌子上禁用它UPDATE,然后再重新启用它:

ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers

UPDATE my_table SET ....;

-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);
Run Code Online (Sandbox Code Playgroud)

如果我在第一个之后不提交,这甚至有效ALTER吗?

另外,如果我在禁用它UPDATE,将它触发的更新,还是会因为它是他们中禁用它忽略这些更新?(我怀疑它会运行,但我宁愿确定。)

我现在正在使用 PG 9.3,但应该很快就会升级。因此,任何提及新版本更改的内容都值得赞赏。

postgresql bulk autovacuum

9
推荐指数
1
解决办法
6031
查看次数

批量数据导入建议

我们正在开展一个项目,该项目需要每天从 Excel 电子表格中导入数据。数据将从预定义的模板中导入,我们在想什么,首先我们将数据上传到临时表中并执行清理操作(删除不必要的信息,在父表中添加新行并获取它们的FK等)。

  • 我需要知道是否有任何可用的工具或实用程序可以减少我们的工作量。
  • 从不同来源(主要来自 Excel 电子表格)插入批量记录的最佳方法是什么?

sql-server bulk import

8
推荐指数
3
解决办法
974
查看次数

批量数据加载和事务日志

我目前正在开发一个项目,该项目从平面文件 (csv) 中批量导入数据,大约 18 个不同的文件通过一些存储过程链接到特定的表。

我按照数据加载性能指南中的建议进行了操作。

数据库处于BulkLogged恢复模式以最小化日志记录,当在包含 600000 行的文件上执行以下存储过程时,我收到错误

消息 9002,级别 17,状态 4,过程 SP_Import__DeclarationClearanceHistory_FromCSV,第 34 行
数据库的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列

(出于测试目的,我在开始导入之前进行了完整备份)。

看着log_reuse_wait_desc我看到以下内容:

log_reuse_wait_desc 检查点。所有其他导入成功导入。

欢迎任何解决此问题的意见。

PROCEDURE [dbo].[SP_Import_DeclarationClearanceHistory_FromCSV]
    @FilePath [nvarchar](1000)
AS
BEGIN
    -- Creating a Temproary Table for importing the data from csv file.
    DBCC TRACEON(610)

    CREATE TABLE #DeclarationClearanceHistory
    (
          [ItemID] [int] IDENTITY(1, 1) NOT NULL ,
          [CMSDeclarationID] [bigint] NOT NULL ,
          [StatusCode] [nvarchar](10) NOT NULL ,
          [SubStatus] [nvarchar](10) NULL ,
          [DepartmentCode] [nvarchar](10) …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization bulk sql-server-2008-r2 import

7
推荐指数
1
解决办法
4330
查看次数

使用 load infile 在批量加载之前或之后建立索引?

我有一个超过 1B 行和两列被索引的数据库(除了 PK)。在加载 infile 之前在表中预先定义索引还是在加载数据之后更好地索引?

关于数据大小和系统的一些注意事项:

  • 系统是带有 8 核和 32GB 内存的 Linux(目前已达到最大值,除非我转向新的硬件)
  • DB 是 1B 行,原始数据大小为 150GB 数据。
  • 数据库是 MyISAM,加载后主要是只读的。

mysql myisam index bulk import

6
推荐指数
2
解决办法
5139
查看次数