【问题标题】:SQL Reporting - Is it better to copy data first into a temporary tableSQL Reporting - 最好先将数据复制到临时表中
【发布时间】:2013-07-24 14:58:52
【问题描述】:

我们有以下格式的表格:

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. 数据是多租户的。即根据运行报告的人员(客户、母公司、区域办事处、产品供应商等)进行过滤

【问题讨论】:

  • 您是否有理由不使用视图来存储查询然后从中运行您的报告?
  • 如果查询需要大量资源来运行,它运行的频率足以成为一个问题,并且用户可以容忍过时的数据,那么缓存结果可能是有意义的.您可以定期更新缓存,也可以在发出请求并且确定缓存内容太旧时更新缓存。第一个意味着用户不必等待结果(保留旧数据直到刷新完成),第二个避免了在无人关心时更新缓存的开销。
  • @betelgeuce 我真的希望你的意思是“索引视图”?

标签: sql sql-server reporting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    Cache A Report

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

    Report Processing Properties

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

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2017-07-13
      • 2013-01-17
      • 2021-07-17
      相关资源
      最近更新 更多