我有两个表,记录从外部源不断插入到这些表中。可以说,这些表保存着用户交互的统计信息。当用户单击按钮时,该单击的详细信息(用户,单击时间等)将写入表之一。当用户将鼠标悬停在该按钮上时,一条记录及其详细信息会添加到其他表中。
如果有很多用户不断与系统进行交互,那么将生成大量数据,并且这些表将极大地增长。
当我想查看数据时,我想以每小时或每天的分辨率查看它。
有没有一种方法或最佳实践可以按要求的分辨率不断地汇总数据(收集数据时)?
还是有解决此类问题的更好方法?
PS。到目前为止,我发现Talend之类的ETL工具可以使生活变得轻松。
更新:目前我正在使用MySQL,但是我想知道与数据库,环境等无关的最佳实践。
最佳答案
在低延迟数据仓库应用程序上执行此操作的通常方法是拥有一个分区表,该表的前导分区包含可以快速更新的内容(即,无需即时重新计算聚合),但尾随分区则被聚合回填。换句话说,前导分区可以使用与尾随分区不同的存储方案。
大多数商业和某些开源RDBMS平台(例如PostgreSQL)都可以支持分区表,分区表可用于一种或多种方式。读者将练习如何从日志中填充数据库。
基本上,这种类型的系统的结构如下:
日期或日期时间值的种类,
按小时,天或其他方式划分
Cereal 似乎合适。日志
条目将附加到此表中。
分区,定期作业索引或
总结并将其转换为
其“冻结”状态。例如,一个
Oracle上的作业可能会创建位图
在该分区上建立索引或更新
物化 View 以包含摘要
该分区的数据。
汇总或合并分区
一起。
回填在前沿之后
划分。历史数据是
转换为可借用的格式
自身进行绩效统计
边查询边查询
分区保持易于更新
很快。由于该分区没有
有这么多的数据,
整个数据集是相对的
快速。
在DBMS平台之间,此过程的确切性质有所不同。
例如,SQL Server上的表分区并不是很好,但是可以使用Analysis Services(Microsoft与SQL Server bundle 在一起的OLAP服务器)来完成。这是通过将前导分区配置为纯ROLAP(OLAP服务器仅对基础数据库发出查询),然后将尾随分区重建为MOLAP(OLAP服务器构造自己的专用数据结构,包括称为“聚合”的持久性摘要)来完成的。 )。分析服务可以对用户完全透明地执行此操作。它可以在后台重建分区,而旧的ROLAP分区仍对用户可见。构建完成后,它将在分区中交换。该多维数据集始终可用,不会中断对用户的服务。
Oracle允许独立更新分区结构,因此可以构建索引,也可以在物化 View 上构建分区。通过查询重写,Oracle中的查询优化器可以计算出可以从实例化 View 中获得从基本事实表计算出的合计数字。该查询将从具有分区的实例化 View 中读取聚合数据,而从没有分区的前导分区中读取数据。
PostgreSQL也许可以做类似的事情,但是我从来没有考虑过在其上实现这种类型的系统。
如果您可以忍受周期性的中断,那么可以通过汇总并在前导数据和尾随数据上建立 View 来明确地执行类似操作。这允许在不支持透明分区的系统上进行这种类型的分析。但是,在重建 View 时,系统将发生短暂中断,因此您无法在工作时间内真正做到这一点-通常是在一夜之间。
编辑:根据日志文件的格式或可用的日志选项,有多种方法可以将数据加载到系统中。一些选项是:
tail -f
的工作方式),但是Windows上的默认行为有所不同;两种系统都必须编写为能够很好地相互配合。 在大多数情况下,跟踪您去过的地方成为一个问题。轮询文件以发现更改可能是不可行的,因此您可能需要设置记录器,以使其与日志阅读器配合使用。
关于database - 分辨率不同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021951/