如果您正在进行最小/最大/平均值查询,您更喜欢使用聚合表还是仅查询原始表中一系列行?
这显然是一个非常开放的问题,没有一个正确的答案,所以我只是在寻找人们的一般建议。假设原始数据表由时间戳、数字外键(例如用户 ID)和一个十进制值(例如购买金额)组成。此外,请假设表中有数百万行。
我已经尝试过两种方法并感到矛盾。一方面,聚合表使我的查询速度显着提高,但代价是增加了大量表格。显示聚合范围的当前值要么需要完全返回到原始数据表,要么需要组合更细粒度的聚合。我发现,在应用程序代码中跟踪要查询的聚合表比想象的要多,同时模式更改将是必要的,因为最初的聚合范围将不可避免地不够用(“但我想看看我们过去 3 个付款周期的销售额!”)。
另一方面,从原始数据查询可能会非常缓慢,但可以让我在数据范围上非常灵活。当范围边界更改时,我只需更改查询而不必重新构建聚合表。同样,应用程序代码需要更新的次数较少。我怀疑,如果我的索引更聪明一些(即始终拥有良好的覆盖索引),我就能够减少选择原始数据所遭受的惩罚,但这并不是万全之策。
是否有可能兼得两全?
这显然是一个非常开放的问题,没有一个正确的答案,所以我只是在寻找人们的一般建议。假设原始数据表由时间戳、数字外键(例如用户 ID)和一个十进制值(例如购买金额)组成。此外,请假设表中有数百万行。
我已经尝试过两种方法并感到矛盾。一方面,聚合表使我的查询速度显着提高,但代价是增加了大量表格。显示聚合范围的当前值要么需要完全返回到原始数据表,要么需要组合更细粒度的聚合。我发现,在应用程序代码中跟踪要查询的聚合表比想象的要多,同时模式更改将是必要的,因为最初的聚合范围将不可避免地不够用(“但我想看看我们过去 3 个付款周期的销售额!”)。
另一方面,从原始数据查询可能会非常缓慢,但可以让我在数据范围上非常灵活。当范围边界更改时,我只需更改查询而不必重新构建聚合表。同样,应用程序代码需要更新的次数较少。我怀疑,如果我的索引更聪明一些(即始终拥有良好的覆盖索引),我就能够减少选择原始数据所遭受的惩罚,但这并不是万全之策。
是否有可能兼得两全?