データベース スキーマの設計 - アーカイブ機能を向上させるためのヒント?

StackOverflow https://stackoverflow.com/questions/486919

質問

アプリケーションからのログエントリを保存するデータベース内のテーブルを設計しています。このデザインについていつもより考えさせられることがいくつかあります。

  • ただし、これらのログ エントリは実行時にシステムが意思決定を行うために使用されるため、比較的高速にアクセスする必要があります。
  • また、それらが大量に発生するという問題もあります (私の推定では、月あたり 1,250 万個が追加されると考えられます)。
  • 意思決定の処理に必要なのは、せいぜい過去 30 ~ 45 日です。
  • サポートと法的問題のために、すべてのファイルを 45 日よりもはるかに長く、おそらく少なくとも 2 年間保管する必要があります。
  • テーブルの設計は非常に単純で、すべて単純なタイプ (BLOB などはなし) であり、可能な場合はデータベース エンジンを使用して、デフォルト データ (最大 1 つの外部キー) を入力します。
  • 違いがある場合、データベースは Microsoft SQL Server 2005 になります。

私が考えていたのは、それらをライブテーブル/データベースに書き込んでから、ETLソリューションを使用して「古い」エントリをアーカイブテーブル/データベースに移動することです。これは大きくて遅いハードウェア上にあります。

私の質問は、これを可能な限りうまく機能させるためのデータベース/テーブルの設計に関するヒント、トリック、または提案を知っていますか?また、それが悪いアイデアだと思われる場合は、もっと良いアイデアだと思うことを教えてください。

役に立ちましたか?

解決

一部のデータベースでは、 "パーティション"(例えばOracleのを、)を提供しています。パーティションを1つに同一の定義を有する複数のテーブルを収集する図のようなものです。あなたは(例えば、月や週の年間%6)別のテーブルにどのソート新しいデータ基準を定義することができます。

ユーザの観点から、これはただ一つのテーブルです。あなたが効率的な方法でそれらに対して(切り捨て、ドロップのように、テーブルから()条件なしで、ロード/ダンプなどを削除)、フル・テーブル・コマンドを実行できるように、データベースハメ撮りから、それは、いくつかの独立したテーブルです。

パーティションを持つことができない場合は、

、あなたは、ビューの同様の効果を得ます。このケースでは、月に一度、「自由」のテーブルへの残りの部分から古いデータを、たとえば、単一のビューで複数のテーブルを収集し、このビューを再定義することができます。さて、あなたは効率的に、この表をアーカイブし、それをクリアして、大きな作業が行われているビューに再びそれを添付することができます。これは、パフォーマンスを向上させるために大いに役立つはずです。

[EDIT] SQL Server 2005では、以降(エンタープライズ版)は、パーティションをサポートしています。おかげでミッチ小麦にhref="https://stackoverflow.com/users/16076/mitch-wheat">

他のヒント

ビッグテーブルはすぐに遅く、それは大きなテーブルから、日付に基づいてデータを取得し、古い行を削除するためにETLを使用するために大きなパフォーマンスのオーバーヘッドです。あなたの数値に基づいて、おそらく1台/月 - これに対する答えは、複数のテーブルを使用することです。もちろん、あなたがあなたのクエリ内のテーブル名を生成するためにいくつかのロジックが必要になります。

私は月の終わりに、あなたはその後、MonthAuditYYYYMMにそのテーブルの名前を変更することができ、「CurrentMonthAudit」テーブルを移入するためにトリガーを使用してに同意します。 ETLを使用して、メインサーバーから古いテーブルを移動すると、その後、簡単になりますし、あなたのテーブルのそれぞれが管理可能になります。これは約250Mの行を持つ単一のテーブルを管理しようとするよりもはるかに優れている私を信頼しています。

あなたの最初の良い意思決定を可能な限り単純にすべてを維持されます。

私はレコードがちょうど年代順に起工され、単純な書き込み専用のトランザクションログファイルのあなたのパターンと幸運を持っていました。その後、高齢者のデータをスイッチングするためのいくつかのオプションがあります。でも、毎月の異なるテーブルを持つことは限り、あなたは心の中でシンプルさを保つように管理クエリが賢明です。あなたが運転中での複製のいずれかの種類を持っている場合は、あなたのレプリケート表は、ロールアウトし、アーカイブとしての役割を果たすことができます。その後、各月の最初で新鮮な空のテーブルで開始します。

通常、私はこのような何かをやってのリレーショナル設計の帰結で身震いが、私はあなたがここで扱っている理由のため、書き込み専用の履歴ログテーブルは、通常のデザインパターンの例外であることを発見しました。

しかし、トリガから離れて滞在。可能な限り。最も簡単な解決策は、あなたが簡単な堅牢な既製時間実績のあるレプリケーションメカニズムで、ここで話している種類の主要なテーブルです。

(ところで - 大きなテーブルは、それらがうまく設計されている場合はすぐに遅くなることはありません - 。彼らは徐々にスローダウン)

で、すべてのデータベースを使用しないでください:あなたは、最近のログレコードを検索する必要がない場合は、

、別のオプションがあります。代わりに、毎晩のファイルにログ情報を書き込み、ファイル名を回転させます。ファイルが書き込まれている場合、あなたは、アーカイブデータベースに直接データをインポートするためにバックグラウンドジョブを開始することができます。

データベースは特に、ログファイルのために、常に最良の選択肢ではありません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top