【发布时间】: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 一次(例如每小时)并将数据复制到运行报告的临时表中,还是我们应该每当用户请求查看报告时,总是运行所有这些联接?
注意:
- 报告最多可以过期一个小时。因为它们通常每周/每月运行一次。
- 数据是多租户的。即根据运行报告的人员(客户、母公司、区域办事处、产品供应商等)进行过滤
【问题讨论】:
-
您是否有理由不使用视图来存储查询然后从中运行您的报告?
-
如果查询需要大量资源来运行,它运行的频率足以成为一个问题,并且用户可以容忍过时的数据,那么缓存结果可能是有意义的.您可以定期更新缓存,也可以在发出请求并且确定缓存内容太旧时更新缓存。第一个意味着用户不必等待结果(保留旧数据直到刷新完成),第二个避免了在无人关心时更新缓存的开销。
-
@betelgeuce 我真的希望你的意思是“索引视图”?
标签: sql sql-server reporting