【发布时间】:2010-12-29 16:18:08
【问题描述】:
如果您正在执行最小/最大/平均查询,您更喜欢使用聚合表还是简单地跨原始表中的一系列行进行查询?
这显然是一个非常开放的问题,没有一个正确的答案,所以我只是在寻找人们的一般建议。假设原始数据表由时间戳、数字外键(比如用户 ID)和十进制值(比如购买金额)组成。此外,假设表中有数百万行。
我都做了,我很伤心。一方面,聚合表给了我更快的查询速度,但代价是增加了额外的表。显示聚合范围的当前值要么需要完全返回原始数据表,要么需要组合更细粒度的聚合。我发现在应用程序代码中跟踪查询哪个聚合表的时间比您认为的要多,并且需要更改架构,因为原始聚合范围总是不够的(“但我想看看我们在过去 3 个付款期的销售额!”)。
另一方面,从原始数据中查询可能会非常缓慢,但让我对数据范围非常灵活。当范围边界发生变化时,我只需更改查询,而不必重建聚合表。同样,应用程序代码需要更少的更新。我怀疑如果我在索引方面更聪明(即始终具有良好的覆盖索引),我将能够减少从原始数据中进行选择的代价,但这绝不是万能药。
有没有我可以两全其美?
【问题讨论】:
-
我通常使用 MySQL,但希望人们的提示适用于所有 SQL 数据库。
-
@pr1001:在某种程度上这是一个普遍的问题,但是一些数据库提供了使这个问题变得更容易的机制(例如 Oracle 的“物化视图”),所以这样做“正确”将是数据库- 特定程度
标签: sql performance indexing aggregation maintainability