テーブルパーティションのSQL分割/マージ:実装する最良の方法は何ですか?
-
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句でパーティションフィールドを指定する必要があることに注意してください。そのフィールドを指定しない場合、クエリはおそらくすべてのパーティションをヒットしてデータを取得するため、その時点ではパフォーマンスは向上しません。
役立つことを願っています!多くのパーティション分割を行いました。テーブル構造のいくつかの例を投稿したい場合は&クエリ、それはあなたの環境により良い答えを得るのに役立ちます。