次の形式のテーブルがあります。
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 回 (たとえば 1 時間ごと) 実行し、データをレポートの実行元の一時テーブルにコピーする必要がありますか、それとも、ユーザーが要求するたびにこれらすべての結合を常に実行する必要がありますか?レポートを見ますか?
ノート:
- レポートは最大 1 時間遅れることがあります。それらは通常、毎週/毎月実行されるためです。
- データはマルチテナントです。つまり、誰がレポートを実行しているかに応じてフィルタリングされます (顧客、親会社、地域オフィス、製品プロバイダーなど)。