我们当前的数据库目前的数据分布在每个商店的表结构中,因此特定模式可能有数千个表。
每个表都有非常基本的数据(事务),如下所示:
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,我们数据库的结构,还是有更好的方法来检索所有表的总和。纯利?
答案 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)