私は、既存のSQL Server DBを使用するデータ移行プロセスとWebインターフェイスを開発する必要があるプロジェクトに参加しました。このDBは数年前に別の人が開発したもので、約100 GBのデータがあり、10分ごとに増加しています(デバイスごとに1日あたり144件のレコードから>> 144件のレコードを保存しています)。いくつかのテーブルには約10ミリオンの行があります。重要なのは、メインテーブルは、通常実行される種類のクエリに対して、最も効率的または適切ではない方法で設計されていることです。ここで、私が言うことがすでに実装されているものよりも優れているかどうかを証明する必要があります。 DBには多数のテーブルがありますが、構造は次の図で簡略化できます。
Date_Idフィールドは、DateTimeフィールドを使用する関数によって自動的に生成されます。両方のテーブルに2つのインデックスがあります。各テーブルのクラスターインデックスには、同じ順序でPKフィールドが含まれています。 Unitテーブルの2番目のインデックスにはUnit_Idフィールドのみが含まれ、UnitDataの2番目のインデックスにはUnit_IdフィールドとDateTimeフィールドがこの順序で含まれています。
ただし、デザインは次のようにする必要があります。
この場合、PKフィールドのクラスター化インデックスのみが必要になります。このDB設計では、通常のクエリは次のようになります。
SELECT ud.*
FROM Unit u, UnitData ud
WHERE u.Unit_Id = ud.Unit_Id and ud.DateTime >= 'dd-MM-yyyy'
ORDER BY ud.Unit_Id, ud.DateTime
さて、私が本当に理解していないことがあります。Date_Id列がある唯一の理由は、このテーブルのパーティション列としてそれを使用することだと言われました。このテーブルをパーティション分割することの真の必要性について尋ねましたが、「毎日または毎月のデータが必要なときにクエリをより効率的に実行する」ことが課題でした。これまでは、パーティショニングについてあまり知らなかったので、次のリンクを確認しました。
http://msdn.Microsoft.com/en-us/library/ms190787.aspx
理想的なクエリがデバイスと日時でフィルタリングされることを考えると、質問は次のとおりです。
どうもありがとうございました!!
パーティション分割を使用しても、特定のクエリを処理するようにパーティション分割スキームが構築されている場合にのみ、クエリのパフォーマンスが向上します。
最善のアプローチを特定するには、クエリパターンを確認し、テーブルへのアクセス方法を確認する必要があります。これは、単一の列(パーティション化キー)でのみパーティションを作成できるためで、これが パーティションの削除 に使用されます。
パーティションの除去が発生するかどうか、およびパーティションの除去がどの程度うまく機能するかに影響を与える2つの要因があります。
多くの点で、パーティション化は他のインデックスを使用する場合と同じですが、いくつかの利点があります。ただし、信じられないほど大きなテーブルを扱っていない限り、これらの利点を理解することはできません。個人的には、テーブルのサイズが250 GBを超えるまで、パーティションの作成も考慮しません。ほとんどの場合、適切に定義されたインデックスは、それよりも小さいテーブルの多くのユースケースをカバーします。説明に基づいて、データの大幅な増加は見られないため、適切にインデックス付けされたテーブルがテーブルに対して適切に機能する可能性があります。
問題を解決するためにパーティション分割が実際に必要かどうかを確認することを強くお勧めします。通常、次の目的で非常に大きなテーブルを分割します。
テーブルのパーティション分割mayは、パーティションの動作の制限内で作業できる場合にパフォーマンスを向上させます。次の説明を参照してください。
http://technet.Microsoft.com/en-us/library/ms177411(v = sql.105).aspx
ただし、パーティションが正しく設定されておらず、クエリが単一のパーティション内にとどまることができない場合、パーティションを設定するとサーバーの動作が遅くなる可能性もあります。ゲイル・ショーはこれについての記事を書いています:
https://www.simple-talk.com/sql/database-administration/gail-shaws-sql-server-howlers/
「パーティショニングはクエリのパフォーマンスを向上させることができますが、保証はありません。」また、「要約すると、パーティション分割は主に、メンテナンスの改善、高速ロード、高速削除、およびテーブルを複数のファイルグループに分散する機能のためのものです。主にクエリのパフォーマンスのためではありません。」
これをパーティション分割でお読みください- SSD上のSQL Server-テーブルパーティション 。 #2に関しては、この方法で設計するとテーブルが断片化されます。列の場所を入れ替える必要があります。 DateTimeを最初の列にすると、毎日、Unit_Idごとにスペースを見つける代わりに、新しい行が下部に追加されます。次に、クエリ用のノンインデックスインデックスを作成できます。