0

次の形式のテーブルがあります。

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. レポートは最大 1 時間遅れることがあります。それらは通常、毎週/毎月実行されるためです。
  2. データはマルチテナントです。つまり、誰がレポートを実行しているかに応じてフィルタリングされます (顧客、親会社、地域オフィス、製品プロバイダーなど)。
4

2 に答える 2

1

レポートを実行するたびにデータを完全に最新の状態にする必要がありますか? そうでない場合は、いくつかのオプションがあります(個人的には一時テーブルを使用しません):

キャッシュされたレポート - レポート サーバーに、毎回レポートを生成するのではなく、レポートのコピーをキャッシュさせることができます。キャッシュされたコピーの有効期限が切れると、レポートは更新されます。

レポートをキャッシュする

レポート スナップショット - 特定の時点でレポート サーバーにデータのスナップショットを作成させることができます。レポートは、このスナップショットに対して実行されます。

レポート処理のプロパティ

最終的に、多くの結合などを含むこれらのタイプのレポートが多数ある場合に最適なオプションは、OLTP システムに見られる高度に正規化されたスキーマではなく、レポート用に最適化されたスキーマを使用してデータ ウェアハウス タイプのソリューションを実装することです。

于 2013-07-24T15:33:58.163 に答える
1

OLTP とレポートのタスクを分離することは常に良い考えです。理想的には、異なる DB インスタンスにあります。

ただし、レポートの最近のデータがどのくらいあるべきかを考慮する必要があります。

于 2013-07-24T15:01:25.897 に答える