SQL Serverのデータタイムラインパフォーマンス
-
05-07-2019 - |
質問
3列のテーブルがあります:
user varchar、status varchar、rep int
ステータスと担当者は頻繁に更新され、要件の1つは次のとおりです。
指定された日付で、各ユーザーの日時値ビューのステータスと担当者の値を指定します。
update_at datetime列をテーブルに追加し、既存の行を更新する代わりに同じユーザーで新しい行を挿入できますが、テーブルが大きくなり、クエリ結果を他のテーブルの同様の結果に結合する必要があるため、高速クエリ。
SQL Serverのこの問題に対する最良のパフォーマンスのソリューションは何ですか?
解決
レポート情報の使用方法によっては、履歴テーブルを作成して、メインテーブルを更新する前に、現在の値を履歴テーブルに書き込み、タイムスタンプを追加するのが最善の方法かもしれません。
履歴から特定の日/ユーザー/ステータスのみを実際に選択している場合は、それが最適です
他のヒント
ほとんどの場合、参加時に現在のステータスのみを照会すると想定しているため、これは別個の関連テーブルとして保存します。このタイプのクエリを多数実行し、このタイプのデータをこれだけではなく多くのテーブルに追加する場合は、レポート用に別のOLAPデータベースを作成します。
これを実行している限り、変更を行ったユーザーも記録するかどうかを検討できます。次に、基本的に監査ソリューションを構築しました。
このための1つのオプションは、2つの個別のテーブルを使用することです。「現在の値」テーブル、および履歴テーブル。現在の値のテーブルには、各ユーザーの最新の値のみが含まれます。これにより、テーブルは小さくなり、結合しやすくなります。履歴テーブルには、リストした3つの列とタイムスタンプ列が含まれ、経時的な値の変更を追跡します。現在の値テーブルの値を変更したいときはいつでも、gettime()をタイムスタンプとして使用して、新しい値を持つ行を履歴テーブルに同時に追加します。