AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 55568
Accepted
Milovan Zogovic
Milovan Zogovic
Asked: 2013-12-25 10:48:51 +0800 CST2013-12-25 10:48:51 +0800 CST 2013-12-25 10:48:51 +0800 CST

如何在 Postgresql 中有效地将数百万行从一个表复制到另一个表?

  • 772

我有两个数据库表。一个包含数亿条记录。让我们称之为那个history。另一个是每天计算的,我想将它的所有记录复制到history一个中。

我所做的是运行:

INSERT INTO history SELECT * FROM daily

它确实奏效了一段时间,但随着记录数量的不断增长,它开始变得越来越慢。现在我有大约 200 万条记录需要在一次操作中从复制到复制,daily并且history完成时间太长。

是否有另一种更有效的方式将数据从一个表复制到另一个表?

postgresql
  • 5 5 个回答
  • 84993 Views

5 个回答

  • Voted
  1. Fabrizio Mazzoni
    2013-12-25T11:24:14+08:002013-12-25T11:24:14+08:00

    以 csv 格式转储表格

    COPY table TO '/tmp/table.csv' DELIMITER ',';
    

    使用对大量数据更有效的 COPY 命令。

    COPY table FROM '/tmp/table.csv' DELIMITER ',';
    

    在http://www.postgresql.org/docs/current/static/sql-copy.html查看 postgres 文档以获取更多信息

    • 18
  2. Milovan Zogovic
    2013-12-25T12:53:03+08:002013-12-25T12:53:03+08:00

    问题出在索引上。该history表有 160M 索引行。通过运行或者运行COPY FROM,INSERT INTO .. SELECT不是插入行而是更新索引花费了大量时间。当我禁用索引时,它会在 10 秒内导入 3M 行。现在我需要找到更快的方法来重新索引大表。

    • 18
  3. francs
    2013-12-25T19:17:43+08:002013-12-25T19:17:43+08:00

    您可以使用psql工具,我可能会很高效,如下所示,

    psql -h ${DAILY_HOST_IP} -p ${PG_PORT} ${DB_NAME} ${USER_NAME} -c "copy daily to stdout " | psql -h ${HISTORY_HOST_IP} -p ${PG_PORT} ${DB_NAME} ${USER_NAME}  -c "copy history from stdin"
    

    你也可以写一个shell脚本。

    • 13
  4. Best Answer
    Jayadevan
    2013-12-26T20:51:17+08:002013-12-26T20:51:17+08:00

    如果您打算长时间(数月)保留历史记录,我建议您查看分区选项 - 可能是每天或每周的一个分区,依此类推。它还取决于您的历史表的访问模式(您是否运行跨日期访问数据的查询?您是否进行了很多聚合等)。查看用于存储聚合/摘要的物化视图。 http://www.postgresql.org/docs/9.3/static/ddl-partitioning.html http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

    • 12
  5. Willem Van Onsem
    2014-08-20T06:37:25+08:002014-08-20T06:37:25+08:00

    这当然不是您问题的确切答案,但如果您不需要访问该history表,您也可以生成一个 SQL 转储:

    pg_dump -h host -p port -w -U user db > dump.sql
    

    然后可以使用一种工具git来计算差异并有效地存储它。

    git add dump.sql
    git commit -m "temp dump"
    git gc --aggressive
    

    这很有用,因为数据库中的大多数部分不会每天都在变化。可以存储两天之间的差异,而不是每天存储整个副本。

    您可以使用crontab每天处理转储的作业。

    • 3

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve