【发布时间】:2012-10-07 12:17:18
【问题描述】:
我有一张有 1000 万行的大桌子。我需要为每一行获取一些统计值。我有生成这个值的函数,例如GetStatistic(uuid)。这个函数工作很慢,结果值不经常变化,所以我在我的表中创建了列Statistic,并且每天执行一次这样的查询:
UPDATE MyTable SET Statistic = GetStatistic(ID);
在选择查询中,我使用列 Statistic 而不调用 GetStatistic 函数。
问题是,我的生产服务器有 64 个 CPU 和大量内存,所以几乎所有 DB 都可以缓存到 RAM,但这个查询只使用一个 CPU,需要 2 或 3 个小时来执行。
GetStatistic 函数使用表,在UPDATE 查询的所有执行过程中保持不变。我可以修改查询以让 postgre 使用所有可用的 CPU 同时为不同的行并行计算 GetStatistic 吗?
【问题讨论】:
-
为什么要使用函数,有什么是普通SQL无法完成的吗?该函数是否只需要来自当前行的值,还是还涉及其他数据源(:=tables)?顺便说一句:向我们展示函数。
-
查看这个查询的计划,你会看到这个函数被调用了10M次。也许用纯 SQL 编写会更好,而且速度会更快。
标签: postgresql parallel-processing sql-update