我有一个表,必须每小时从 Greenplum 中提取数据来填充该表。该表存储在 Greenplum 服务器上。

所以,我想知道的是,什么方法(python脚本,Windows调度程序或任何东西)适合我的数据(我猜可能有60GB或更多)应该用于调度查询(用postgreSQL编写) )每小时运行一次。

有人可以附上相同的示例代码吗?

有帮助吗?

解决方案

你会想做一个并行的 COPY 从 Greenplum 到 PostgreSQL 的数据范围。确保 PostgreSQL 设置为快速数据加载。如果可能的话,使用 UNLOGGED 桌子;否则使用 wal_level = 'minimal' 至少。

有多少并行工作线程最取决于 PostgreSQL 服务器的 I/O 子系统。测试看看。

我建议将 Python 与 psycopg2 一起使用 copy_expert 光标功能。看 文档. 。使用带有管道的多处理在读取器和写入器工作器之间共享类似文件的对象,读取器连接到 greenplum,写入器连接到 PostgreSQL。

因此,每个工作人员实际上都会执行类似于以下 shell 伪代码的操作:

psql -h greenplum-box \
     -c "COPY (SELECT * FROM mytable WHERE id BETWEEN 1 AND 10000) TO stdin" \
  | \
psql -h postgres-box \
     -c "COPY myttable FROM stdin";

(但是你使用 pyscopg2 将两者连接起来, copy_export, 、多重处理和管道)。

完成所有常见的快速加载工作,例如随后创建索引。看 如何加快 PostgreSQL 中的插入性能.

如果您有磁盘空间,请创建一个表,例如 dataload_temp, ,填充它,然后在一笔事务中删除旧的并将新的重命名为旧的名称。这样,干扰就会最小化。

或者,看看 pg_bulkload 用于离线(但非流式)批量数据加载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top