有效地为来自 2 个不同服务器的 N 个值选择顶部/最大值/平均值(任何聚合函数)



我有 2 个不同的 Web 服务,它们又与 2 个不同的 POSTGRES 数据库通信,这两个数据库具有完全相同的模式(但数据不同)。

这些服务的职责是根据传递的条件触发一组查询并检索结果。

现在的问题是——我正在开发一项新服务,它假设积累/聚合这些服务的结果并将其作为最终结果发送。触发的查询可以包含分组依据、具有子句、排序依据、聚合函数。

对于这个问题,我能想到的唯一解决方案是从两个数据库(如果存在限制时的事件)获取给定条件的所有数据,然后根据用户的要求在我的终端执行聚合操作。

例如,发送到我的服务的查询是 -

select sum(salary), dept_id 
from employee 
group by dept_id 
order by sum(salary) desc
limit 2;

这意味着我只需要发送各部门的前 2 名工资的总和。现在最棘手的部分来了

假设这是输出,

From DB1:
sum(salary) | dept_id 
10 | 2
8  | 1
5  | 3

From DB1:
sum(salary) | dept_id 
30 | 3
8  | 1
1  | 2

因此,如果我将限制传递给两个服务并仅获得前 2 名,那么输出将是错误的。

DB1: Sends (10,2) and (8,1)
DB2: Sends (30,3) and (8,1)

现在,如果我根据dept_id在服务中总结(1/2/3)聚合服务:(30,3) 和 (16,1)

虽然实际输出应该是,但两个数据库的两个值的最大值加在一起

Max(DB1+DB2) - 
dept_id1 - (8 + 8) = 16
dept_id2 - (10 + 1) = 11
dept_id3 - (30 + 5) = 35

所以我的实际输出应该是:(35,3)和(16,1)。

通过此示例,您可以看到我需要来自两个数据库的所有值。在我的服务中执行所需的聚合/筛选条件,然后输出结果。

这样做的问题是性能

  1. 如果我直接在数据库中触发查询,则应用所有过滤器并返回结果大约需要 2 秒
  2. 当我的服务与这些数据库对话时,它会检索它们的所有数据(在从他们的末端进行少量计算后,如求和),在我的服务中执行计算。这大约需要 20 秒
    • 其中,这些数据库需要 15 秒才能获取所有聚合数据。 我的代码在服务端对数据进行排序/过滤/聚合需要 5 秒。

问题:如何提高这里的性能?有没有更好的方法来处理这种情况?任何可以部分应用的算法或调整都可以将性能提高一点?如果您需要有关我如何处理它的任何其他信息,请告诉我。

注意:我有并行线程,它们独立地从这些服务中的每一个读取数据。所以那里没有性能问题。我有并行流来处理来自这两个服务的这些数据,所以即使这样也不应该成为问题。

使用 dblink

是我在 oracle 数据库中更喜欢的方法,谷歌搜索指出 PostGreSQL 中也有 dblink。

使用 dblink,您可以将这些表视为在您的架构中。这将帮助您使用 UNION 子句同时获取两个结果,然后您可以一起对两个表中的数据执行所需的聚合,就像它们来自同一个表一样。

select SUM(SALARY),ID from(select SALARY,ID from test1@DB_LINK_NAME1 UNION select SALARY,ID from test2@DB_LINK_NAME_2) group by ID order by sum(SALARY) desc;

最新更新