跨越大量表的SQL总和

时间:2015-03-25 00:52:12

标签: python sql postgresql sqlalchemy

我们当前的数据库目前的数据分布在每个商店的表结构中,因此特定模式可能有数千个表。

每个表都有非常基本的数据(事务),如下所示:

store1_table:
| id | total_revenue | net_profit | date |
| 1  | 25            | 5          |      |
| 2  | 36            | 10         |      |
| 3  | 20            | 7          |      |

我试图在特定时间段内获得所有商店的总销售额。

对于单个商店,性能非常合理,但是当我尝试查询所有表(数百或数千)的总数时,性能会显着降低。

对于我使用SQLAlchemy的SQL查询,但是它生成了一个合理的简单查询,例如:

viewport = union_all(*hundredsOfTables)
session.query(func.sum(viewport.c.net_profit))

是导致性能问题的UNION ALL,我们数据库的结构,还是有更好的方法来检索所有表的总和。纯利?

1 个答案:

答案 0 :(得分:1)

怀疑这么多表中的union_all实际上是个问题,请先尝试在单个表级聚合,然后总结中间结果:

# get list of sum-queries for all tables
sub_queries = [session.query(func.sum(_.c.net_profit).label("sub_net"))
               for _ in hundredsOfTables]

# create a union subquery
u = sub_queries[0].union_all(*sub_queries[1:])
u = u.subquery("tmp")
# create a query which gets the grand-total
t = session.query(func.sum(u.c.sub_net)).scalar()
print(t)