我有一个表,必须每小时从从 Greenplum 中提取的数据中填充。该表存储在 Greenplum 服务器上。
所以,我想知道什么方法(python 脚本、windows 调度程序或任何东西)适合我的数据(我猜它可能高达 60GB 或更多)应该用于调度查询(用 postgreSQL 编写) 每小时运行一次。
有人可以附上相同的示例代码吗?
我有一个表,必须每小时从从 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
离线(但非流式传输)批量数据加载。