Postgres:将大型数据子集(10k +行)从一个模式复制到另一个模式,以便立即使用

时间:2017-06-13 17:58:00

标签: postgresql sqlbulkcopy

我需要根据需要将行从一个Postgres架构推送到另一个架构。一个模式存储内容,另一个模式是最终用户将为其自定义用途添加,修改和删除的数据子集的副本。随着更多内容的添加以及更多内容被最终用户吸收和定制,每个模式表中有超过10万条记录并且在不断增长。移动的数据将是从多个表到另一个模式中的多个表的数千条记录。这些模式位于同一数据库中。这些数据将一直在移动,并且需要非常快速,以便最终用户可以在选择内容后立即开始自定义。我已经查看了COPY函数以及触发复制,但似乎没有一个像所需的那样快速执行。我无法在插入之前删除索引,因为这些表经常被消费者使用。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

由于您正在从数据库的一个模式中的一堆表复制到同一数据库的另一个模式,并且无法启动,直到您使用INSERT INTO ... SELECT FROM最快的方式执行此操作,请运行为有权访问这两种模式的用户,例如:

INSERT INTO schema2.table_y ( field, field, field )
SELECT field, field, field
FROM schema1.table_y
WHERE user filter condition

由于您必须在多个表上执行此操作,因此您可以将其包装在一个大事务中,或者在一个大查询中使用Writeable CTEs执行多个insert语句。

这确实是获取数据副本的最快方法。但是它仍然需要非零时间;提取数据的SELECT查询都需要一些时间,因为在多个表中插入数千行。您减少这段时间的方法是一般查询和性能优化。

如果操作工作使得用户不需要数据的副本,而只需要数据的实时子集,那么您可以使用VIEWs进行探索,包括可更新的数据。但听起来你需要一份副本。