1

SQL Server を継承しましたが、テーブルのパーティショニングの問題を発見しました。よくわからない理由で、既存のテーブル パーティションに新しいパーティションを追加できません。

環境:

SQL Server 2005 Enterprise、データベースのサイズは約 400 GB、RAM は 4 GB、32 ビット システムのみ。

分割されたテーブルの詳細:

*テーブルは、複数のディスク ボリューム上の 13 個のファイル グループに分割されています。

*パーティション関数は、datetime 値である 12 の境界点を持つ RANGE LEFT です。

※境界点は日付四半期構造(例:2009-12-31 23:59:59、2010-03-31 23:59:59、2010-06-30 23:59:59)で構成されています。

*日時の値はパーティション キーです。

*データは現在の日付に基づいてテーブルに毎日挿入されますが、関数の最後の境界点は「2010-06-30 23:59:59」であるため、最後のファイル グループのみがデータを受け取ります。

*テーブルには、テーブルと整列されたクラスター化インデックスと、3 つの非一意の非クラスター化インデックスがあります (2 つは整列され、1 つは完全に異なるファイル グループに存在します)。

*現在のテーブル ボリュームの詳細:

データ容量: 75GB+

インデックス容量: 50GB+

行数: 2 億以上

問題:

現在、最後のファイル グループ/パーティションには最大の日付境界ポイントがないため、日付「2010-06-30 23:59:59」以降のすべてのデータがこのパーティションに挿入されているか、まだ挿入されています。幸いなことに、トランザクション データの量はかなり少ないですが、2 年間で最終的なパーティションは 22 GB という驚異的なサイズにまで成長しました。この既存のパーティションからデータを分割または削除したくありません。ただし、新しいファイル グループを追加し、既存のパーティション関数を変更して、将来のすべてのデータが新しいファイル グループに挿入されるようにしたいと考えています。新しい将来の日付を境界点として追加して、その日付以降に挿入されたすべてのデータが新しいファイル グループ/パーティションに移動するようにしたいと考えています。

使用した方法:

ALTER DATABASE 関数 - SUCCESSを使用して新しいファイル グループ/ファイルを追加しました。

新しく作成されたファイル グループが 'NEXT USED' に割り当てられるようにパーティション スキームを変更しました - SUCCESS。--パーティションスキームを変更するために使用されるスクリプト--

ALTER PARTITION SCHEME [partition_scheme_name] NEXT USED (new_filegroup_name);

Partition Function を変更して、新しい境界点 - FAILを追加しました。

--関数に新しい境界点を追加するために使用されるスクリプト--

ALTER PARTITION FUNCTION partition_function_name() SPLIT RANGE ('2012-10-01 23:59:59) GO

エラー:

SPLIT RANGE 手法を使用して既存のパーティションに新しい境界点を追加すると、データベース トランザクション ログがいっぱいになったため失敗しました (18GB に制限されています)。これには 2 つの理由で驚きました - 1): SPLIT RANGE の使用はメタデータ関数のみだと思っていました (間違っている場合は修正してください) 2): 私の新しい境界点は日付としてテーブルにまだ存在しません値なので、データの移動はないと想定しました。

私がこれまでに試したこと:

*テストサーバーを使用してこの方法を正常にテストしましたが、データセットははるかに小さくなりました.

*次に、本番データベースの完全なコピーをテスト システムに復元しました。無制限に大きくなる 2 つ目のデータベース ログ ファイルを追加し、パーティション関数を再度変更しようとしました。元のデータベースのトランザクション ログは予想どおりいっぱいになりましたが、セカンダリ データベースのトランザクション ログは 60 GB に増加しました。さらに、tempdb は 14 GB に増加しました。別のエラーが原因でプロセス全体が再び中止されたときに、新しいファイル グループのサイズが増加し始めました。今回は以下のエラーでした。

('一意のインデックス'Index_name' を持つオブジェクト'table_name' に重複キー行を挿入できません)。

ここで私を完全に困惑させる2つのことがあります:

1): テストのエラーで言及されているインデックスは、クラスター化されていない非一意のインデックスです。重複エラーが発生するのはなぜですか?

2): さらに言えば、新しい最大境界点として新しい datetime 値を追加していますが、この値はまだテーブルに存在しません。なぜデータ移動があるのでしょうか???

前述のように、はるかに小さなデータセットを使用してこの方法をテストしたところ、完全に機能しました。本番データセットで機能しない理由がわかりません。ここで非常に明白な何かが欠けていますか? どんなアドバイスでも大歓迎です。お時間をいただきありがとうございます。

4

1 に答える 1

0

あなたが望むのは、分割されたテーブルを分割することだと思います。使用したコマンドは正しいです。新しい境界を追加し、新しいファイルグループを追加する「スキームクエリの作成」を試したほうがよいと思います「スキームに関連する関数クエリを作成する」に完全に機能するようにします。そうすることで、以前のファイルグループにあったデータが分割されます。

したがって、クエリのソースで「スキームの作成と関数の作成」を試してみてください。:)

于 2012-10-10T08:58:16.420 に答える