我有两个不同的web服务,它们依次与两个不同的POSTGRES数据库通信,这两个数据库有完全相同的模式(但数据不同)。
这些服务的职责是根据传递的条件触发一组查询并检索结果。
现在的问题是-
我正在开发一个新的服务,它将累积/聚合这些服务的结果,并将其作为最终结果发送。
激发的查询可以包含GROUPBY、having子句、ORDERBY和聚合函数。
对于这个问题,我唯一能想到的解决方案是从数据库中获取给定条件下的所有数据(如果存在限制,则为Event),然后根据用户的请求在我的终端执行聚合操作。
例如,发送给我的服务的查询是-
select sum(salary), dept_id
from employee
group by dept_id
order by sum(salary) desc
limit 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)
现在,如果我根据部门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)。
通过这个例子,您可以看到我需要来自两个数据库的所有值。在我的服务中执行所需的聚合/筛选条件,然后输出结果。
问题在于表演。
如果直接在数据库中启动查询,则应用所有过滤器并返回结果大约需要2秒。
当我的服务与这些数据库进行对话时,它会检索它们的所有数据(在从它们的末端进行类似汇总的小计算之后),在我的服务中执行计算。这大约需要20秒。
其中,这些数据库需要15秒才能获取所有聚合数据。我的代码花费5秒在我的服务端对数据进行排序/筛选/聚合。
问题:
如何提高这里的性能?有没有更好的方法来处理这种情况?有没有可以部分应用的算法或调整来稍微提高性能?
如果你需要我如何处理的其他信息,请告诉我。
注意:我有并行线程,它们独立地从这些服务中读取数据。所以没有性能问题。
我有并行流来处理来自这两个服务的数据,所以即使这样也不成问题。
最佳答案
在oracle数据库中使用dblink是我比较喜欢的方法,google搜索显示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;