假设您有一个程序每 30 秒将 (timestamp, stock_price) 记录到 SQL 数据库,并且您想要生成不同时间尺度的股票价格图。如果您绘制 1 小时范围内的测量值,则可以使用在此期间采集的所有 120 个样本。但是,如果您想绘制 1 年范围内的价格,您显然不想从数据库中提取超过 100 万个样本。最好从数据库中提取一些有代表性的样本子集。
这让我想起了计算机图形学中的细节层次技术——当你远离 3d 模型时,可以使用模型的低保真版本。
是否有表示数据库中详细信息级别信息的常用技术,或用于快速查询均匀分布的数据子集(例如,给我 2009 年 1 月的 100 个均匀分布的样本)?
到目前为止,我提出的解决方案是在数据库表中包含一个 level_of_detail 列。如果 level_of_detail=0,则该行包含一个瞬时样本。如果 level_of_detail=n,则该行包含最后 (sample_interval*(2^n)) 秒数据的平均值,并且此级别的行数为 1/(2^n)。该表在 (level_of_detail, timestamp) 上有一个索引,当您想要生成绘图时,您可以根据您想要的样本数量计算适当的 level_of_detail 值并使用该约束进行查询。缺点是:
- 对于 N 个样本,该表需要存储 2*N 行
- 客户端必须知道指定适当的 level_of_detail 约束
- 当样本被添加到表中时,一些进程需要负责构建平均行