テーブルパーティションのSQL分割/マージ:実装する最良の方法は何ですか?

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

  •  03-07-2019
  •  | 
  •  

質問

MicrosoftのMSDN エントリについてSQL 2005パーティションを変更し、いくつかの可能なアプローチをリストしました:

  • 目的のパーティション関数を使用して新しいパーティションテーブルを作成し、INSERT INTO ... SELECT FROMステートメントを使用して、古いテーブルのデータを新しいテーブルに挿入します。
  • ヒープにパーティション化されたクラスター化インデックスを作成する
  • DROP EXISTING = ON句を指定したTransact-SQL CREATE INDEXステートメントを使用して、既存のパーティションインデックスを削除して再構築します。
  • 一連のALTER PARTITION FUNCTIONステートメントを実行します。

データが1年から2年にわたって広がるレコードの日付(月次パーティションのようなもの)に基づいたパーティションを持つ大規模DB(数百万レコード)の最も効率的な方法は何でしょうか?

また、最近の情報に(読み取りのために)ほとんどアクセスする場合、最後のX日間パーティションを保持することは理にかなっており、残りのデータはすべて別のパーティションになりますか?または、(日付範囲に基づいたランダムアクセスのために)残りのデータもパーティション分割する方が良いでしょうか?

役に立ちましたか?

解決

最初のアプローチ(新しいパーティションテーブルを作成して挿入すること)をお勧めします。これは、古いテーブルと新しいテーブルを比較する贅沢を与えるからです。両方のスタイルのテーブルに対してクエリプランをテストし、クエリが本当に高速かどうかを確認してから、新しいテーブルデザインにカットオーバーできます。改善が見られない場合や、最終結果に落ち着く前に、いくつかの異なるパーティション関数/スキームを試してみたい場合があります。日付範囲以外でパーティションを作成することもできます-日付は必ずしも有効ではありません。

データが6-7年にわたって広がっている300-500mの行テーブルでパーティションを作成しましたが、そのテーブル挿入アプローチが最も有用であることがわかりました。

パーティション分割の方法について質問しました。最良の答えは、クエリが単一のパーティションにヒットするようにパーティションを設計することです。クエリを最近のデータに集中させる傾向がある場合、およびwhere句でその日付フィールドをフィルターする場合は、はい、最新のX日間に個別のパーティションを作成します。

where句でパーティションフィールドを指定する必要があることに注意してください。そのフィールドを指定しない場合、クエリはおそらくすべてのパーティションをヒットしてデータを取得するため、その時点ではパフォーマンスは向上しません。

役立つことを願っています!多くのパーティション分割を行いました。テーブル構造のいくつかの例を投稿したい場合は&クエリ、それはあなたの環境により良い答えを得るのに役立ちます。

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