0

我们有以下格式的表格:

Order(OrderID,CustomerID,OrderDate,CreatedByUserID,LastModifiedByUserID)
OrderItem(OrderID,ProductID,ProviderID,ItemStatus,CompletedByUserID)
Companies(CompanyID, CompanyName, CompanyParentID, CompanyRegionID)

生成订单报告所需的完整数据表需要近 12 个连接和大约 250 个字段。下面是一个简短的例子

SELECT o.OrderID, o.CustomerID ... FROM Orders AS o
INNER JOIN OrderItems AS items ON o.OrderID = items.OrderID
INNER JOIN Products AS p ON items.ProductID = p.ProductID
INNER JOIN Companies AS cust ON o.CustomerID = cust.ComapnyID
LEFT OUTER JOIN Companies AS prov ON items.ProviderID = prov.ComapnyID
INNER JOIN Users AS u1 ON items.CreatedByUserID = u1.UserID
INNER JOIN Users AS u2 ON items.LastModifiedByUserID = u2.UserID
LEFT OUTER JOIN Users AS ui1 ON items.CompletedByUserID = ui1.UserID
LEFT OUTER JOIN Users AS ui2 ON items.VerifiedByUserID = ui2.UserID
LEFT OUTER JOIN Companies AS parent ON cust.CompanyParentID = parent.ComapnyID
LEFT OUTER JOIN Companies AS region ON cust.CompanyRegionID = region.ComapnyID

我的问题是:既然这是一个报告应用程序,我们应该运行一次这个 SQL(例如每小时)并将数据复制到运行报告的临时表中,还是应该在用户请求时始终运行所有这些连接看报告?

笔记:

  1. 报告最长可能会过期一个小时。因为它们通常每周/每月运行一次。
  2. 数据是多租户的。即根据谁在运行报告(客户、母公司、区域办事处、产品供应商等)对其进行过滤
4

2 回答 2

1

将 OLTP 和报告任务分开总是一个好主意。理想情况下在不同的数据库实例中。

但是您必须考虑到报告中的最新数据应该是多少。

于 2013-07-24T15:01:25.897 回答
1

这真的取决于您需要什么,您是否需要每次运行报告时数据都是最新的?如果没有,那么您有几个选择(我个人不会使用临时表):

缓存报表 - 您可以让报表服务器缓存报表的副本,而不是每次都生成它,一旦缓存副本过期,它将被刷新:

缓存报告

报告快照 - 您可以让报告服务器在某个时间点创建数据的快照,然后报告将针对此快照运行:

报告处理属性

最终,如果您有许多此类具有许多连接的报表,那么最好的选择是使用针对报表进行优化的架构而不是 OLTP 系统中的高度规范化架构来实现数据仓库类型的解决方案。

于 2013-07-24T15:33:58.163 回答