SQL报告 - 最好先将数据复制到临时表中

时间:2013-07-24 14:58:52

标签: sql sql-server reporting

我们有以下格式的表格:

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

为Orders生成报告所需的完整数据表需要近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. 数据是多租户。即根据运行报告的人(客户,母公司,地区办事处,产品提供商等)进行过滤。

2 个答案:

答案 0 :(得分:1)

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

但您必须考虑报告中最近的数据应该如何。

答案 1 :(得分:1)

这实际上取决于您的需求,您是否需要在每次运行报告时使数据完全更新?如果没有,那么你有几个选择(我不会亲自使用临时表):

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

Cache A Report

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

Report Processing Properties

最终,如果您有许多具有许多联接的报告类型,那么最佳选择是使用针对报告优化的模式实现数据仓库类型解决方案,而不是OLTP系统中的高度规范化模式