我有一个表格,其中包含每小时收集的一些统计数据。 现在我希望能够快速获得每日/每周/每月/每年/总数的统计数据。 表现明智的最佳方式是什么?创建视图?功能?存储过程?还是普通表,我必须在更新数据时同时写入? (我想避免后者)。 我目前的想法是创建一个总结小时数的view_day,然后是view_week和view_month以及view_year,它们总结了view_day中的数据,view_total总结了view_year。是好还是坏?
答案 0 :(得分:3)
这里基本上有两个系统:一个收集数据,另一个报告数据。
针对经常更新的事务表运行报告可能会导致读取锁定阻止写入尽快完成,从而可能降低性能。
通常最好定期运行"收集"任务从您的(可能是高度规范化的)事务表中收集信息,并将该数据填充到非规范化的报表中,形成一个"数据仓库"。然后,您将报告引擎/工具指向非规范化的数据仓库"可以在不影响实时事务数据库的情况下查询。
此收集任务应该只在您的报告需要准确的时间运行"准确"。如果你每天可以逃脱一次,那太好了。如果您需要每小时或更长时间执行此操作,请继续,但在您执行此操作时,请监控性能对写入任务的影响。
请记住,如果您的交易系统的性能很重要(通常是这样),请避免不惜一切代价运行报告。
答案 1 :(得分:1)
是的,拥有存储已汇总数据的表是一种很好的做法。
而视图,以及SP和函数只会对大表执行查询,而效率不高。
答案 2 :(得分:1)
唯一真正快速且可扩展的解决方案就是当您使用适当的索引将“正常表格在更新数据时同时写入”时。您可以使用triggers自动更新此类表。
答案 3 :(得分:0)
我的观点是,复杂的计算应该只发生一次,因为数据不是每次查询都会发生变化。创建聚合数据并通过触发器(如果没有可接受的日志)或通过每天运行一次或每小时运行一次的作业或可接受报告的任何延迟时间填充它。如果你去触发路线,测试,测试,测试。确保它可以处理多行插入/更新/删除以及更常见的单行插入/删除。确保它尽可能快,并且没有任何错误。触发器将为每个数据操作添加一些处理,您必须确保它添加尽可能小的位,并且不会发生任何会阻止用户插入/更新/删除数据的错误。
答案 4 :(得分:0)
我们遇到了类似的问题,我们所做的是利用主/从关系。我们在主服务器上执行事务数据(读取和写入,因为在我们的例子中,某些读取需要超快并且不能等待事务的复制)。奴隶正在快速复制数据,但随后我们将关闭该数据,包括报告。
我强烈建议使用这种方法,因为如果您的数据足够精细,可以在报告层/应用中使用,那么它很容易作为一个快速而肮脏的数据仓库。