PostgreSQL的.可以在paralell中运行更新查询吗?
我有一个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擅长于许多较小查询的并发加载,并且很容易以这种方式使系统饱和,它只是在为一两个非常大的查询充分利用系统资源. 你能做的就是将工作分成几块,然后交给工人.你曾经提到过:
有许多工具,如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函数,它很可能会快得多.如果您显示此功能可能会有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |