SQL 2005 データベースの大規模なテーブルには、より優れたパフォーマンスが必要です。

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

質問

私は SQL 2005 (Standard Edition) データベースを使用するデータ駆動型 Web アプリケーションに取り組んでいます。

テーブルの 1 つはかなり大きい (800 万行以上、約 30 列)。テーブルのサイズは、ストアド プロシージャを通じてテーブルから項目を選択する Web サイトのパフォーマンスに明らかに影響します。テーブルにはインデックスが付けられていますが、テーブル内の行の量が膨大であるため、依然としてパフォーマンスが低下しています。これが問題の一部です。テーブルは更新と同様に読み取りが行われるため、次のいずれかを作成せずにインデックスを追加/削除することはできません。操作が悪化します。

ここでの目標は、テーブルから項目を選択するときのパフォーマンスを向上させることです。テーブルには「現在の」データと古い/ほとんど触れられていないデータがあります。この段階で考えられる最も効果的な解決策は、テーブルを 2 つに分割することです。つまり、古いアイテム (特定の日付、たとえば 2005 年 1 月 1 日以前) 用と新しいアイテム (2005 年 1 月 1 日以前) 用の 1 つです。 。

Distributed Partitioned View などの機能は知っていますが、これらの機能にはすべて Enterprise Edition が必要であり、クライアントはそれを購入しません (ハードウェアを投入することも起こりません)。

役に立ちましたか?

解決

たとえそれが正しい方法とは思えなかったとしても、いつでも独自の「貧乏人の分割/DPV」を実行することができます。これは単なる広範な概念的アプローチです。

  1. 同じ構造、同じインデックスを使用して、今年のデータ用の新しいテーブルを作成します。メインの大きなテーブルに書き込むストアド プロシージャを、両方のテーブルに (一時的にだけ) 書き込むように調整します。ストアド プロシージャのロジックを IF CURRENT_TIMESTAMP >= '[時間のない日付全体]' にすることをお勧めします。これにより、ログを開始するプロシージャへの変更より前の日付のこのテーブルのデータを簡単にバックフィルできるようになります。

  2. メイン テーブルから SELECT INTO を使用して、履歴の年ごとに新しいテーブルを作成します。現在のデータベースでのオーバーヘッドを回避するために、同じインスタンス上の別のデータベースでこれを行うことができます。履歴データは変更されないと思うので、この別のデータベースでは、完了時に読み取り専用にすることもできます (これにより、読み取りパフォーマンスが大幅に向上します)。

  3. テーブル全体のコピーを取得したら、現在の年のみを参照するビューや、2005 年から現在の年を参照する別のビューを作成できます (現在のテーブルと、2005 年以降の他のデータベース内のテーブルの間で UNION ALL を使用します)。 )、もう 1 つは 3 つのテーブル セット (前述のテーブルと 2005 年より前のテーブル) をすべて参照します。もちろん、これをさらに細分化することもできますが、私はコンセプトを最小限に抑えたかっただけです。

  4. データを読み取るストアド プロシージャを「よりスマート」になるように変更します。要求された日付範囲が現在の暦年内にある場合は、ローカルのみの最小のビューを使用します。日付範囲が 2005 年以上の場合は 2 番目のビューを使用し、それ以外の場合は 3 番目のビューを使用します。現在の年にのみ関連する新しいデータを挿入するだけでなく、書き込みを行うストアド プロシージャでも同様のロジックに従うことができます。

  5. この時点で、大規模なテーブルへの挿入を停止し、すべてが機能していることが証明されたら、テーブルを削除してディスク領域を再利用できるはずです (これは、データ ファイル内の領域を再利用のために解放することを意味します)データベースの縮小は実行しません - そのスペースを再度使用するため)。

あなたの状況をすべて詳しく把握しているわけではありませんが、ご質問やご不明な点がございましたら、フォローアップしてください。私は、現在進行中のものも含め、いくつかの移行プロジェクトでこのアプローチを使用してきました。

他のヒント

  

の性能が原因テーブル内の行の膨大な量に悪い

800万行は、すべてのことが狂っ鳴りません。あなたは、クエリプランをチェックしましたか?

  

テーブルが同じくらいに更新として読み込まれます。

あなたが実際にインデックス付きの列を更新しているか、それが均等に読み込まれ、の挿入のか?

  

タグ(なし、それをハードウェアを投げることはどちらか起こるだろうされていません)
RAMは汚れ安いですので、

それは残念だ。

すべてのインデックスを再構築します。これは、クエリのパフォーマンスを向上します。 それを行う方法をクラスタ化と非の再構築への影響についてこのともっとあります-clustered指数<のhref = "http://blogs.msdn.com/khen1234/archive/2007/02/27/does-rebuilding-a-clustered-index-rebuild-nonclustered-indexes.aspx" のrel = "nofollowをnoreferrer ">ここの

第二DBが格納されているドライブ上のデフラグメンテーションを実行します。

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