Share via


パーティション分割

データベースをパーティション分割すると、パフォーマンスが向上し、メンテナンスが容易になります。データの一部にしかアクセスしないクエリでは、大きなテーブルを複数の小さいテーブルに分割すると、スキャンするデータが少なくなるので処理が高速になります。また、インデックスの再構築やテーブルのバックアップなどのメンテナンス作業にかかる時間を短縮できます。

パーティション分割は、個々のテーブルを分割せず、各テーブルを物理的に別々のディスク ドライブに配置することにより実現されます。あるテーブルとそれに関連するテーブルを別々の物理ドライブに格納すると、クエリのパフォーマンスが向上します。これは、テーブル間の結合を含むクエリの実行時に、複数のディスク ヘッドによってデータを同時に読み取れるためです。SQL Server のファイル グループを使用して、テーブルを格納するディスクを指定できます。

ハードウェア パーティション分割

ハードウェア パーティション分割では、利用可能なハードウェア アーキテクチャを活用できるようにデータベースをデザインします。次に、ハードウェア パーティション分割の例を示します。

  • 操作を複数のスレッドで実行できるマルチプロセッサにより、多数のクエリを同時に実行できます。また、マルチプロセッサではクエリの構成要素を同時に実行できるので、単一クエリをより高速に実行できる場合があります。たとえば、クエリで参照する各テーブルを異なるスレッドから同時にスキャンできます。

  • RAID (Redundant Array of Independent Disks) デバイスでは、複数のディスク ドライブにわたってデータをストライピングし、データへのアクセスを高速化することができます。これは、同時にデータを読み取る読み書きヘッドの数が増えるためです。通常、テーブルを複数のドライブにわたってストライピングすると、同じテーブルを 1 つのドライブに格納した場合より高速にスキャンできます。また、テーブルとその関連テーブルを別のドライブに格納すると、これらのテーブルを結合するクエリのパフォーマンスが大幅に向上する場合があります。詳細については、「RAID」を参照してください。

行方向のパーティション分割

行方向のパーティション分割では、1 つのテーブルを複数のテーブルに分割します。分割後の各テーブルの列数は同じですが、行数は少なくなります。たとえば、10 億行が格納されたテーブルを 12 個のテーブルに行方向にパーティション分割し、各テーブルにより特定年の 1 か月分のデータを表すことができます。特定月のデータを必要とするクエリでは該当するテーブルだけが参照されます。

テーブルを行方向にパーティション分割する方法は、データの分析方法によって異なります。テーブルは、クエリで参照するテーブル数ができる限り少なくなるようにパーティション分割する必要があります。そのように分割しないと、クエリ時に論理的にテーブルをマージする UNION クエリが多数実行され、パフォーマンスが低下する場合があります。行方向にパーティション分割されたテーブルに対するクエリの詳細については、「ビューの使用に関するシナリオ」を参照してください。

一般的に、行方向のパーティション分割は、データの経過時間や用途に基づいて行います。たとえば、テーブルには最近 5 年間のデータが格納されていますが、当年のデータだけが定期的にアクセスされるとします。この場合、データを 5 つのテーブルにパーティション分割し、各テーブルには 1 年分のデータだけを格納するようにすることができます。

詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。

列方向のパーティション分割

列方向のパーティション分割は、1 つのテーブルを複数のテーブルに分割して列数を少なくします。列方向のパーティション分割には、正規化と行の分割の 2 種類があります。

  • 正規化とは、あるテーブルに存在する重複列を削除し、主キーと外部キーのリレーションシップでプライマリ テーブルにリンクされたセカンダリ テーブルにその列を格納する、標準的なデータベース処理です。

  • 行の分割は、元のテーブルを列分割し、列数が少ない複数のテーブルにします。分割されたテーブルの各論理行は、他のテーブルの同じ論理行に対応し、UNIQUE KEY 列によって特定されます。UNIQUE KEY 列は、パーティション分割されたすべてのテーブルで同一です。たとえば、分割された各テーブルの ID 712 の行を結合すると、元の行が再作成されます。

行方向のパーティション分割と同様に、列方向のパーティション分割により、スキャンするデータが少なくなります。その結果、クエリのパフォーマンスが向上します。たとえば、7 つの列で構成されているテーブルで、通常は最初の 4 列だけが使用される場合、後半の 3 列を別のテーブルに分割すると、パフォーマンスが向上します。

列方向のパーティション分割は、複数のパーティションからデータを分析する場合に、クエリで各テーブルを結合する必要があるので、慎重に検討する必要があります。また、結合するパーティションが非常に大きい場合には、パフォーマンスに影響する場合もあります。