web-dev-qa-db-ja.com

巨大なテーブルにクラスター化インデックスを作成する簡単な方法?

そのため、パフォーマンスが大幅に低下しているという不満がある顧客サイトがあります。一見したところ、問題はSomebody Else(grrrr)がクラスター化インデックスなしで約2,000万以上のレコードを保持するテーブルを設計したことが原因であることは明らかです。

次に、そのテーブルにクラスター化インデックスを作成します。ただし、テスト環境ではcreate indexコマンドが1時間実行されましたが、まだ完了していません。カスタマーサイトは24時間365日稼働する製造現場であり、インデックスを作成する間、1時間のダウンタイムを許容できません。

インデックスを作成するブルートフォース方式があまりない方法で、ジョブをすばやく終了したり、ビジー状態のときにサーバーのパフォーマンスを完全に停止させないスマートな方法で実行したりできますか?

SQL Server Enterprise Editionを使用しています。

22
Shaul Behr
  • SQLサーバーがEnterprise +エディションで、テーブルにBLOBフィールドがない場合-CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • そうでない場合-同じスキーマを使用してテーブルを作成し、すべてのINSERT/UPDATE/DELETE操作を含めて(たとえば、トリガーを使用して)データを適切に転送し、古いテーブルを正確に削除して名前を変更する以外に方法はありません古いものと同じ名前の新規-短所:遅い、サーバーとストレージに追加の負荷を追加

26
Oleg Dok

顧客が使用しているSQLサーバーのバージョンがわからない。企業では、(ONLINE = ON)を使用してインデックスを作成できるため、インデックスが作成されるまでテーブルを使用できます。

12
Michal Barcik
  • オリジナルと同じ新しいテーブルを作成します(明らかに別の名前が必要になります)
  • 新しいテーブルにクラスター化インデックスを作成する
  • 新しいテーブルにデータを読み込む
  • 元のテーブルをドロップ
  • 元の名前を使用して新しいテーブルの名前を変更する

元から必要とされていた権限を適用していることを確認してください。

8
Bryan