PostgreSQL中的汇总表可提高性能

问题描述

我正在使用postgresql作为数据库我有一个表MASTER(A,B,C,D,N1,N2,N3,N4,N5,N6)其中主键是(A,B,C,D)和N1,N2,N3,N4,N5 ,N6是数字列。

我有如下查询,以获取从MASTERCOMB的每个列表中选择的每个A的汇总数据。

    SELECT MASTERCOM.A,STATS.sumn1,STATS.sumn2,STATS.sumn3,STATS.sumn4,STATS.sumn5,STATS.sumn6
 FROM (WITH 
 sum1 AS (SELECT A,SUM(N1) FROM MASTER WHERE B = $1 GROUP BY A ORDER BY SUM(N1) DESC LIMIT $2),sum2 AS (SELECT A,SUM(N2) FROM MASTER WHERE B = $1 GROUP BY A ORDER BY SUM(N2) DESC LIMIT $2),sum3 AS (SELECT A,SUM(N3) FROM MASTER WHERE B = $1 GROUP BY A ORDER BY SUM(N3) DESC LIMIT $2),sum4 AS (SELECT A,SUM(N4) FROM MASTER WHERE B = $1 GROUP BY A ORDER BY SUM(N4) DESC LIMIT $2),sum5 AS (SELECT A,SUM(N5) FROM MASTER WHERE B = $1 GROUP BY A ORDER BY SUM(N5) DESC LIMIT $2),sum6 AS (SELECT A,SUM(N6) FROM MASTER WHERE B = $1 GROUP BY A ORDER BY SUM(N6) DESC LIMIT $2)

SELECT disTINCT COALESCE(sum1.A,sum2.A,sum3.A,sum4.A,sum5.A,sum6.A) A
    FROM sum1
    FULL OUTER JOIN sum2 ON sum2.A = sum1.A
    FULL OUTER JOIN sum3 ON sum3.A = sum1.A
    FULL OUTER JOIN sum4 ON sum4.A = sum1.A
    FULL OUTER JOIN sum5 ON sum5.A = sum1.A
    FULL OUTER JOIN sum6 ON sum6.A = sum1.A) MASTERCOMB

LEFT JOIN (SELECT A,SUM(N1) sumn1,SUM(N2) sumn2,SUM(N3) sumn3,SUM(N4) sumn4,SUM(N5) sumn5,SUM(N6 sumn6) 
        FROM MASTER WHERE B = $1 GROUP BY A) AS STATS
 ON STATS.A = MASTERCOMB.A

这只是WHERE子句中带有B的一种查询。我可能需要查询不同的组合,例如“ WHERE C = $ 3”或“ WHERE D = $ 4”。在极少数情况下,我可能不得不同时查询B,C和D的多个条件的组合;

随着表的增长,查询性能可能会下降。所以我在想两个办法

方法1:

  • 创建摘要表SMRY_A_B,SMRY_A_C,SMRY_A_D
  • 在每次插入,更新和删除MASTER表时,将值相加,然后插入/更新/删除各自的表

方法2:

  • 使用主键(A,B,C,D)创建摘要表SMRY_A_B_C_D
  • 在每次插入,更新和删除MASTER表时,将值相加,然后插入/更新/删除SMRY_A_B_C_D表

SMRY_A_B_C_D的可能值为

(valA,valB,'N/A',sumn1,sumn2,sumn3,sumn4,sumn5,sumn6) 
(valA,'N/A,valC,sumn6)
(valA,'valD',sumn6)

问题:

  • 哪种方法更好?
  • 我不应该同时考虑主表本身的方法查询吗?如果是这样,我应该优化查询吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)