SQL报告—是否最好先将数据复制到临时表中
我们有以下格式的表格:SQL报告—是否最好先将数据复制到临时表中,sql,sql-server,reporting,Sql,Sql Server,Reporting,我们有以下格式的表格: Order(OrderID,CustomerID,OrderDate,CreatedByUserID,LastModifiedByUserID) OrderItem(OrderID,ProductID,ProviderID,ItemStatus,CompletedByUserID) Companies(CompanyID, CompanyName, CompanyParentID, CompanyRegionID) 生成订单报告所需的完整数据表几乎需要12个联接和大约2
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一次(例如每小时)并将数据复制到运行报表的临时表中,还是应该在用户请求查看报表时始终运行所有这些联接
注意:
将OLTP和报告任务分开总是一个好主意。理想情况下,在不同的数据库实例中
但您必须考虑到,报表中的数据应该是最新的。这实际上取决于您需要什么,您是否需要在每次运行报表时都将数据完全更新?如果没有,那么您有几个选择(我个人不会使用临时表): 缓存的报表—您可以让报表服务器缓存报表的副本,而不是每次生成报表,缓存的副本过期后将刷新报表: 报表快照—您可以让报表服务器在某个时间点创建数据的快照,然后根据此快照运行报表:
最终,如果您有许多此类报告以及许多连接等,那么最好的选择是实施一个数据仓库类型的解决方案,该解决方案具有针对报告进行优化的模式,而不是OLTP系统中的高度规范化架构。您为什么不使用视图存储查询,然后从中运行报表?如果查询需要大量资源来运行,那么运行的频率足以成为一个问题,而且用户可以容忍过时的数据,因此缓存结果可能是有意义的。您可以定期更新缓存,也可以在发出请求并确定缓存内容太旧时更新缓存。第一种方法意味着用户不必等待结果(保留旧数据直到刷新完成),第二种方法避免了在没有人关心的情况下更新缓存的开销。@betelgeuce我真的希望你指的是“索引视图”?