web-dev-qa-db-ja.com

ファイルグループ間でのヒープの移動

データベース内のテーブルを1つのファイルグループ(プライマリ)から別のファイルグループ(プライマリ)に移動したいと思います。クラスタ化されたインデックスを持つテーブルに関するこれに関する多くのアドバイスを見つけることができますが、問題のこれらのテーブルはすべてヒープです。これまでのところ、私はここにあるソリューションを実装しました:

http://gallery.technet.Microsoft.com/scriptcenter/c1da9334-2885-468c-a374-775da60f256f#content

これは基本的に、セカンダリファイルグループのテーブルのクラスター化インデックスを作成するスクリプトを提供し(基本的にデータを移動します)、インデックスを削除してヒープに戻します。これは問題なく動作するように見えますが、私たちのプロダクション要件には遅すぎるかもしれません。

代替ソリューションはありますか?これは、私が唯一の方法であると信じるのに十分エレガントではありません。

注1:テーブルはヒープのままである必要があります。サードパーティのアプリがこれを実施します。

注2:DBのサイズは200テーブルで約150GBです。 197個のテーブルと99.9%のデータがセカンダリファイルグループに移動します。

2
Paul

データを物理的に移動する必要があります-回避する必要はありません。しかし、それを行うにはクラスター化インデックスを作成する必要があるという考えを思いついた人はわかりません。これは特定の手順を他の手順と交換するだけであり、以下に概説する方法とは異なる量の一時スペースを達成する必要はありません。 。

新しいファイルグループに2つ目の空のヒープを作成しないでください。

CREATE TABLE dbo.whatever_copy
(
  ... cols ...
)
ON [second filegroup];

次に、元のテーブルからインデックスや制約などのスクリプトを作成し、データをコピーして、削除する必要がある制約(たとえば、元のテーブルを指す外部キー)を削除してから、元のテーブルを削除し、新しいものの名前を変更します。最後に、インデックスと制約を新しいテーブルに追加します。

 -- script out indexes, constraints etc.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

BEGIN TRANSACTION;

INSERT dbo.whatever_copy(cols) WITH (TABLOCK)
  SELECT cols FROM dbo.whatever;

 -- remove constraints etc.

DROP TABLE dbo.whatever;

EXEC sp_rename N'dbo.whatever_copy', N'whatever', N'OBJECT';

 -- add constraints etc.

COMMIT TRANSACTION;
3
Aaron Bertrand