利用できるオプションはたくさんあります。差し迫った問題を解決するために、ロギングテーブルにシーケンシャルIDが設定されていることを確認し、新しいデータのみを適切にインデックス付けされたレポートテーブルにコピーします。次に、NON-LOCKING procを実行して、レポート内の対応する列の最大値だけを取得し、ログテーブルからさらに大きな値を取得できます。
DECLARE @MaxValue uniqueidentifier
SELECT @MaxValue = MAX(LogID) FROM LogTable
INSERT INTO
ReportingTable
(...)
SELECT
...
FROM
LogTable WITH NOLOCK
WHERE
LogID > @MaxValue
注意:NOLOCKの議論については、これを参照してください。ログテーブルがBIGおよびBUSYの場合にのみ使用してください。ただし、シナリオはそれが理にかなっている例です。
何がGUIDを生成するかはわかりませんが、SQLサーバーの場合、列をデフォルトでNEWSEQUENTIALID()にすると、完全にランダムではなく、シーケンシャルになります。他の場所からGUIDを取得している場合は、bigint IDENTITY(1,1)列を配置して、クラスター化インデックスがひどく断片化されていないことを確認することを検討してください。フラグメント化されたクラスター化インデックスは、他のインデックスがルックアップに使用するため、問題があります。そのため、インデックスがどれほど優れていても、プライマリよりも実行速度が遅くなります。
次に、GUIDのクラスター化インデックスを使用して、レポートテーブルを任意の方法で構造化し、適切にインデックス付けされたテーブルの最大値を使用して、まだ持っていない新しいデータのみを挿入できます。そのテーブルで再インデックスを実行して、可能な限り高速にすることもできます。
詳しくは..
システムが大幅に成長すると予想される場合は、他のレポートパターンを調べて、データをレポートテーブルにダンプするときに、データを非正規化または単純化する必要があります。
星のパターンを見てください。または、毎日または毎週の統計を次のような別のテーブルに非正規化することができます。
Date, TimespentTotal, TimespentAvg, UserFact2Count....
次に、非ロックのストアドプロシージャを実行して、一度に1日の統計を取得できます。また、実行するエージェントジョブが失敗した場合に備えて、レポートデータベースにないものに基づいて日数の統計をロードすることをお勧めします。次に実行するときに、バックログが処理されます。明らかに、これらのパターンははるかに手間がかかり、間違った選択は悪い場合があるため、レポートに何が期待されるかを知る必要がある場合にのみ、この選択を行ってください。