加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL的.可以在paralell中运行更新查询吗?

发布时间:2020-12-13 16:17:59 所属栏目:百科 来源:网络整理
导读:我有一个10米行的大桌子.我需要为每一行获得一些统计值.我有生成此值的函数,例如GetStatistic(uuid).这个函数运行速度很慢,结果值不经常更改,所以我在表中创建了列统计信息,每天执行一次这样的查询: UPDATE MyTable SET Statistic = GetStatistic(ID); 在se
我有一个10米行的大桌子.我需要为每一行获得一些统计值.我有生成此值的函数,例如GetStatistic(uuid).这个函数运行速度很慢,结果值不经常更改,所以我在表中创建了列统计信息,每天执行一次这样的查询:
UPDATE MyTable SET Statistic = GetStatistic(ID);

在select查询中,我使用列Statistic而不调用GetStatistic函数.

问题是,我的生产服务器有64个CPU和大量内存,因此几乎所有数据库都可以缓存到RAM,但是这个查询只使用一个CPU,需要2或3个小时才能执行.

GetStatistic函数使用表,在所有UPDATE查询执行期间都是常量.我可以修改查询以获得postgre,使用所有可用的CPU同时计算不同行的并行中的GetStatistic吗?

PostgreSQL在单个后端执行每个查询,这是一个具有单个线程的进程.它不能使用多个CPU进行查询.它在单个查询中可以实现的I / O并发性也有些限制,实际上只对位图索引扫描执行并发I / O,否则依赖于OS和磁盘系统进行并发I / O.

Pg擅长于许多较小查询的并发加载,并且很容易以这种方式使系统饱和,它只是在为一两个非常大的查询充分利用系统资源.

你能做的就是将工作分成几块,然后交给工人.你曾经提到过:

Can i modify query to get postgre to calculate GetStatistic in paralel
for different rows simultaneously,using all avaliable CPUs?

有许多工具,如DBlink,PL/Proxy,pgbouncer和PgPool-II,旨在帮助完成这类工作.或者,您可以自己动手,开始(比方说)8个工作人员,每个人都连接到数据库并执行UPDATE … WHERE id BETWEEN?和?具有不重叠ID范围的语句.更复杂的选择是让队列控制器向工作人员分发大约1000个ID的范围,然后更新该范围然后请求新的.

请注意,64个CPU并不意味着64个并发工作者是理想的.在写入时,您的磁盘I / O也是一个因素.如果将UPDATE事务设置为使用commit_delay并且(如果对此数据的业务要求是安全的)则可以帮助您稍微降低I / O成本,则synchronous_commit =’off’则应显着降低同步负载.尽管如此,最好的吞吐量可能会远低于64名并发工人.

通过将GetStatistic函数转换为可内联的SQL函数或视图,而不是大概是一个循环繁重的程序PL / pgSQL函数,它很可能会快得多.如果您显示此功能可能会有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读