gpt4 book ai didi

PostgreSQL 如何在多个 CPU 之间拆分查询

转载 作者:行者123 更新时间:2023-11-29 12:05:28 25 4
gpt4 key购买 nike

我有一个存储过程

DO_STUFF(obj rowFromMyTable) 

这取obj并处理一些数据并将结果保存在一个独立的表中。所以我处理对象的顺序并不重要。

DO_STUFF(objA); DO_STUFF(objB); < == >  DO_STUFF(objB); DO_STUFF(objA);

事情是想创建一个存储过程来处理所有对象,但这只使用一个 CPU。

for each obj in (SELECT obj from tblSOURCE)
loop
DO_STUFF(obj);
end loop;

我想在多个 CPU 中拆分进程,以便更快地完成。
我唯一想到的是使用 2 个 pgAdmin 窗口并在每个窗口中运行两个不同的存储过程。

--one window run using the filter
(SELECT obj from tblSOURCE where id between 1 and 100000)

--and the other use
(SELECT obj from tblSOURCE where id between 100001 and 200000)

关于我应该如何在单个存储过程中执行此操作的任何想法?

最佳答案

我喜欢使用的一种快速多线程查询技术是结合使用 psqlGNU Parallel ( http://www.gnu.org/software/parallel/parallel_tutorial.html ) 以允许多个要立即运行的 psql 命令。

如果您创建一个包含循环的包装存储过程并向其添加参数以获取偏移量和限制,那么您可以创建一个快速的 bash 脚本(或 Python、Perl 等)来生成一系列 psql 命令需要的。

包含命令的文件可以通过管道传输到并行文件中,或者使用所有可用的 CPU,或者使用您确定的数量(我经常喜欢使用 4 个 CPU,这样也可以限制盒子上的 I/O,但这取决于您拥有的硬件)。

假设包装器名为 do_stuff_wrapper(_offset, _limit)。偏移量和限制将应用于选择:

select obj from tblSOURCE offset _offset limit _limit

您生成的 psql 命令文件(我们称之为 parallel.dat)可能看起来像这样:

psql -X -h HOST -U user database -c "select do_stuff_wrapper(0, 5000);"
psql -X -h HOST -U user database -c "select do_stuff_wrapper(5001, 5000);"
psql -X -h HOST -U user database -c "select do_stuff_wrapper(10001, 5000);"

等等。

然后你可以像这样运行命令:

cat parallel.dat | parallel -j 4 {}

让多个 psql 命令同时运行。 Parallel 还将为您流水线化 IO(如果有的话,例如 NOTICE 等),使其以命令顺序结束。

编辑:如果您在 Windows 上运行,您或许可以安装 Cygwin,然后从那里使用并行。另一个纯 Windows 选项是研究 Powershell 以完成类似于并行的操作(请参阅 Can Powershell Run Commands in Parallel?)。

关于PostgreSQL 如何在多个 CPU 之间拆分查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23376210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com