0

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

テーブルの1つはかなり大きいです(約30列の800万行以上)。テーブルのサイズは、ストアドプロシージャを介してテーブルからアイテムを選択するWebサイトのパフォーマンスに明らかに影響します。テーブルにはインデックスが付けられていますが、テーブル内の行の量が非常に多いため、パフォーマンスは低下します-これは問題の一部です-テーブルは更新されたものと同じように読み取られるため、インデックスを追加/削除するには、操作が悪化します。

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

分散パーティションビューのようなものは知っていますが、これらの機能にはすべてEnterprise Editionが必要であり、クライアントはこれを購入しません(また、ハードウェアを投入することもありません)。

4

3 に答える 3

3

適切な方法のように思えなくても、いつでも独自の「貧乏人のパーティショニング / DPV」を展開できます。これは、大まかな概念的なアプローチにすぎません。

  1. 今年のデータ用に新しいテーブルを作成します - 同じ構造、同じインデックス。メインの大きなテーブルに書き込むストアド プロシージャを調整して、両方のテーブルに書き込むようにします (一時的にのみ)。ストアド プロシージャのロジックを IF CURRENT_TIMESTAMP >= '[時間のない日付全体]' にすることをお勧めします。

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

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

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

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

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

于 2010-02-08T06:48:31.203 に答える
1

すべてのインデックスを再構築します。これにより、クエリのパフォーマンスが向上します。それを行う方法はこれであり、クラスター化インデックスと非クラスター化インデックスの再構築への影響の詳細はこちら

次に、DB が保存されているドライブでデフラグを実行します。

于 2010-02-08T08:09:54.957 に答える
1

テーブル内の行数が非常に多いため、パフォーマンスが低下しています

800 万行というのは、それほどおかしくはありません。クエリプランを確認しましたか?

テーブルは更新されるのと同じように読み込まれます

実際にインデックス付きの列を更新していますか、それとも同じように読み取りと挿入を行っていますか?

(いや、ハードウェアを投げつけることもありません)

RAMが安いので残念です。

于 2010-02-08T13:57:41.053 に答える