Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

主にSQL Server パーティション分割の効果について説明する。

パーティションの設計指針(分割指針)

主に、日付などの論理的にグループ化された
データ サブセットを管理するのに適切であるかどうかによって決定される。

「パーティション分割列」

範囲

「パーティション関数」により指定される。

データ型

以下のデータ型を除くインデックス キーとして使用できるデータ型の列を使用できる。

「パーティション関数」

定義

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) 
  AS RANGE RIGHT FOR VALUES ( [ boundary_value [ ,...n ] ] ); 

上記の「パーティション関数」(partition_function_name)では、
指定の型(input_parameter_type)の「パーティション分割列」に
格納された値に基づき「パーティション分割」を行う。

なお、RANGE にはLEFTより、RIGHTを指定することが推奨される。

 CREATE PARTITION FUNCTION partition_function_name ( int ) 
   AS RANGE RIGHT FOR VALUES ( 100, 200, 300 ); 

と指定した場合、この「パーティション関数」によって、

の4つの「パーティション」に分割される。

「パーティション」と「ファイル グループ」

双方の関係は以下のようになる。

パーティションの作成手順

「パーティション構成」の定義する

「パーティション関数」の「パーティション分割」で指定された「パーティション」と、
「ファイル グループ」のマップを指定して、「パーティション構成」を定義する。

パーティション構成の定義:

CREATE PARTITION SCHEME partition_schema_name
  AS PARTITION partition_function_name
    TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] );

上記の「パーティション構成」の定義では、

※ 「パーティション構成」で使用できる「パーティション関数」は1つのみ。
※ 1つの「パーティション関数」は、複数の「パーティション構成」で使用できる。

「パーティション テーブル」を作成する。

「パーティション構成」と「パーティション分割列」を指定し、「パーティション テーブル」を作成する。

パーティション テーブルの定義:

CREATE TABLE table_name(
<column_definition>[ ,...n ]) 
  ON partition_schema_name (div_column_name); 

「パーティション インデックス」を作成する。

「パーティション構成」に「パーティション分割列」を指定し、
「パーティション テーブル」に「固定」された、「パーティション インデックス」を作成する。

パーティション インデックスの定義:

 CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
   ON table_name (column_name);
     ON partition_schema_name (div_column_name);

「パーティション構成」の確認方法

「パーティション関数」の名前と境界の確認

 SELECT f.name, r.value, *
   FROM sys.partition_range_values r
     INNER JOIN sys.partition_functions f
       ON r.function_id = f.function_id

「パーティション構成」、「ファイル グループ」、「パーティション番号」の関係を確認

SELECT
  ps.name As [パーティション構成名], 
  ds.name As [ファイル グループ名], 
  dds.destination_id As [パーティション番号], 
  *
FROM
  sys.destination_data_spaces dds
    INNER JOIN sys.partition_schemes ps
      ON dds.partition_scheme_id = ps.data_space_id
    INNER JOIN sys.data_spaces ds
      ON dds.data_space_id = ds.data_space_id
ORDER BY
  partition_scheme_id

データが格納された「パーティション番号」を確認

SELECT
  *, $PARTITION.partition_function_name(expression) As [パーティション番号]
FROM
  table_name

若しくは、

SELECT
  $PARTITION.partition_function_name(expression) As [パーティション番号] ,
  COUNT(*) As [行数]
FROM
  table_name
GROUP BY
  $PARTITION.partition_function_name(expression)

性能の向上ポイント

ファイル・グループの性能向上に加え、

以下の性能向上を図ることができる。

検索性能の向上

「パーティション」毎に

スキップ・スキャン、ロック局所化

スキップ・スキャン

併置結合によるテーブル結合

検索性能が劣化するケース

パーティション分割によって、クエリ性能が劣化するケースもあるもよう。

運用性能の向上

メンテナンス

が、「パーティション」毎に可能となり、

データのアーカイブ(スライディング ウインドウ)

適切に「パーティション分割」を行えば、下記のような、古いデータを順次
アーカイブする「スライディング ウインドウ」と呼ばれる操作が可能である。

「スライディング ウインドウ」操作は、次の手順で行われる。

以下に、「スライディング ウインドウ」操作の注意点を纏める。

インデックスの断片化の局所化、デフラグや再構築の局所化と高速化

「パーティション インデックス」

「パーティション インデックス」を「パーティション テーブル」に「固定」

「パーティション インデックス」の「固定」が必要なケース

一意性制約

「パーティション分割列」を含んでいるユニーク インデックス(一意性制約)

スライディング ウインドウ

「パーティション インデックス」を「パーティション テーブル」に「固定」
することにより、「データのアーカイブ(スライディング ウインドウ) 」が可能になる。

併置結合

「パーティション インデックス」を「パーティション テーブル」に「固定」
することにより、「併置結合によるテーブル結合」が可能になる。

「パーティション インデックス」の「固定」が不要なケース

インデックスや、「パーティション インデックス」は、
ベースの「パーティション テーブル」の「パーティション構成」から独立して実装できる。

参考

パーティション インデックス

クエリ処理の機能強化

自習書シリーズ


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS