从数百万交易数据中获得最畅销的商品

时间:2014-03-01 08:52:08

标签: sql performance oracle

假设我有一个在线商店应用程序,其中包含由应用程序维护的数百万个项目。该应用程序如此着名,每小时销售数百万件物品。我将所有这些信息存储在一个数据库中,比如Oracle DB。

现在,如果我想显示过去1小时内售出的前5个项目,那么我可以写一个类似的查询:

  • 获取最近1小时内售出的产品清单。
  • 从上面的结果中查找每个产品的数量,并按该计数值排序,然后显示前5个记录。

这似乎是一个有效的查询,但问题是,如果我销售了数百万件物品,则每1小时一次,然后对包含所有交易信息的表运行此查询肯定会遇到性能问题。我们如何解决这些问题?有没有其他方法可以实现它。

2 个答案:

答案 0 :(得分:3)

作为一个说明,亚马逊在网络星期一的高峰期每小时销售超过一百万件物品。您必须能够访问令人难以置信的数据存储。

分区绝对是一种解决方案,但它可能有点复杂。当你说“最后一小时”可以越过分区边界。没什么大不了的,但这意味着每个查询都要访问多个分区。

即使是一百万件物品,每小时也只有几百件物品。这个可能给你足够的余地来添加一个触发器(或者可能是现有触发器的逻辑),它将维护你正在寻找的汇总表。

我认为这是一种值得思考的东西。

我怀疑你实际上在查询真实的操作系统。我的猜测是,每秒处理十几个销售的任何环境将在操作系统上运行此类查询。该架构更有可能成为决策支持系统的补充。并且,当数据进入系统时,这为您提供了实现额外汇总表的余地。这不是在负载上创建触发器的问题。相反,它是根据信息从原始操作系统传递到决策支持系统的方式,将详细数据加载到一个表中并将摘要信息加载到另一个表中的问题。

答案 1 :(得分:1)

我认为你应该试试partitioning

E.g。您可以使用range partitioning将每个月/周/数据的数据拆分到不同的分区中,然后在最后一个小时,只对特定的最后一个分区运行查询非常容易。请参阅partitioning-wise joins以了解详情。

当然,你需要执行一些具体的实施步骤,但每场战争都需要牺牲一些......