Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL报告—是否最好先将数据复制到临时表中_Sql_Sql Server_Reporting - Fatal编程技术网

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一次(例如每小时)并将数据复制到运行报表的临时表中,还是应该在用户请求查看报表时始终运行所有这些联接

注意:

  • 这些报告可能会过期一小时。因为它们通常每周/每月运行
  • 数据是多租户的。i、 e.根据运行报告的人员(客户、母公司、区域办事处、产品供应商等)进行过滤

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


    但您必须考虑到,报表中的数据应该是最新的。

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

    缓存的报表—您可以让报表服务器缓存报表的副本,而不是每次生成报表,缓存的副本过期后将刷新报表:

    报表快照—您可以让报表服务器在某个时间点创建数据的快照,然后根据此快照运行报表:


    最终,如果您有许多此类报告以及许多连接等,那么最好的选择是实施一个数据仓库类型的解决方案,该解决方案具有针对报告进行优化的模式,而不是OLTP系统中的高度规范化架构。

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