sql server パーティション 概要
TRANSCRIPT
SQL Server パーティション 概要
小澤 真之 (@Masayuki_Ozawa)
http://engineermemo.wordpress.com
パーティションの基本構成
パーティションのメリット
デモ
本日の Agenda
2
パーティションの基本構成
3
はじめに
4
パーティションは Enterprise Edition / Datacenter Edition で使用できる機能です Standard Edition では使用できません Enterprise Edition 以上の機能なので
「データ圧縮」 「オンラインインデックス操作」 「Column Store Index」 と併用することができます。
Enterprise Edition 特有の動作 並列インデックス操作 先行読み取り時のページ数の増加 拡張スキャン (メリーゴーラウンドスキャン)
パーティションのメンテナンス作業が必要になるためデータベースエンジニアがいない企業様での運用お勧めしません
パーティションの一般的な種類
5
• 列の値の範囲に基づきデータを格納する領域を分散させる
• 登録日時 : 2010/4/1 ~ 2011/3/31 → 格納領域 A
• 登録日時 : 2011/4/1 ~ 2012/3/31 → 格納領域 B
レンジパーティション
• データのハッシュ値に基づきデータを格納する領域を分散させる
• データのハッシュ値 : A → 格納領域 A
• データのハッシュ値 : B → 格納領域 B
ハッシュパーティション
SQL Server で使用できるパーティションの方式
SQL Server でも レンジパーティションを
応用して実装することは可能
通常のテーブルの基本構成
6
テーブル
2010 年度の データ
2011 年度の データ
2012 年度の データ
データベース
ファイルグループ (PRIMARY)
データファイル 1
(mdf)
データファイル 2 (ndf)
データファイル 3 (ndf)
テーブルは一つのファイルグループに所属し複数のファイルグループには
所属できない
パーティションテーブルの基本構成
7
テーブル
2010 年度の データ
2011 年度の データ
2012 年度の データ
データベース
ファイルグループ 1
データファイル 2 (ndf)
ファイルグループ 2
データファイル 3 (ndf)
ファイルグループ 3
データファイル 4 (ndf)
テーブルが複数のファイルグループに関連つき、データの範囲により厳密にデータがファイルグループに
結びつく。
単一のDB / テーブルで データの格納領域を 厳密に水平分割する
パーティションの構成
8
•パーティションの境界値を指定しデータの分割方法を定義
•CREATE PARTITION FUNCTION Table1_PF (datetime) AS RANGE RIGHT FOR
VALUES (‘2009/4/1’, ‘2010/4/1’, ‘2011/4/1’)
•境界値を左右どちらのパーティションに含めるかを RIGHT / LEFT で指定するが一般
的には RIGHT を使用
パーティション関数
•データを格納するファイルグループを定義
•CREATE PARTITION SCHEME Table1_PS AS PARTITION Table1_PF TO (FG1,
FG2, FG3, FG4)
•1 つのファイルグループでパーティションをすることも可能
•CREATE PARTITION SCHEME Table1_PS AS PARTITION Table1_PF ALL
パーティション構成
パーティション構成概要
9
FG1 FG2 FG3 FG4
2009/4/1 2010/4/1 2011/4/1
2009/4/1 ~
2010/3/31
2010/4/1 ~
2011/3/31
2011/4/1 ~
~ 2009/3/31
パーティション関数
パーティション構成
パーティションテーブルとインデックス
10
• パーティション構成を指定して作成したテーブル
• CREATE TABLE Table_1 (~) ON Table1_PS(Col1)
パーティションテーブルの指定はヒープ構造となる
• クラスター化インデックスのパーティションインデックスを設定することで実データのパーティ
ショニングを行うことも可能
• パーティション テーブルとパーティションインデックスの変更
> 非パーティション テーブルからパーティション テーブルへの変換
http://msdn.microsoft.com/ja-jp/library/ms175864(SQL.105).aspx
パーティション テーブル
• パーティション構成を指定して作成したインデックス
• CREATE INDEX NCI_Table1 ON Table_1 (~) ON Table1_PS(Col1)
• CREATE CLUSTERD INDEX NCI_Table1 ON Table_1 (~) ON Table1_PS(Col1)
• パーティション インデックスの専用ガイドライン
http://msdn.microsoft.com/ja-jp/library/ms187526(SQL.105).aspx
パーティション インデックス
パーティションの操作
11
•特定のパーティションを他のテーブルに切り離すことで瞬時にデータを削除する
•スイッチは空のパーティションに対して実行する必要があるため、スイッチ先にデー
タが入っている場合はスイッチすることができない
•同一のファイルグループ内でのみスイッチができる
•パーティションの切り替えを使用した効率的なデータの転送
http://msdn.microsoft.com/ja-jp/library/ms191160(SQL.105).aspx
スイッチ
•境界値を削除し、パーティション同士を結合する
マージ
•パーティション構成 / パーティション変数を変更し新規のデータ格納領域を追加する
パーティションの追加
パーティションのスイッチ
12
スイッチ元テーブル
スイッチ先テーブル
FG1
~ 2009/3/31
FG2
2009/4/1 ~
2010/3/31
FG3 FG4
2012/4/1 ~
2012/3/31
2010/4/1 ~
2011/3/31
#1 #2 #3 #4
パーティションのスイッチ
13
スイッチ元テーブル (BaseTable)
スイッチ先テーブル (ArchiveTable)
FG1
~ 2009/3/31
FG2
2009/4/1 ~
2010/3/31
FG3 FG4
2012/4/1 ~
2012/3/31
2010/4/1 ~
2011/3/31
ALTER TABLE BaseTable
SWITCH PARTITION 2 TO ArchiveTable PARTITION 2
同一ファイルグループ内で ポインタを付け替えデータを移動
#1 #2 #3 #4
ベーステーブルにインデックスを固定化
14
テーブルとインデックスを同一のパーティションに配置することでスイッチ時にインデックスの構成を保ったまま切り離すことができる
パーティション インデックスの専用ガイドライン http://msdn.microsoft.com/ja-jp/library/ms187526(SQL.105).aspx
パーティションテーブル
パーティションインデックス
FG1
~ 2009/3/31
~ 2009/3/31
FG2
2009/4/1 ~
2010/3/31
2009/4/1 ~
2010/3/31
FG3 FG4
2012/4/1 ~
2012/3/31
2010/4/1 ~
2011/3/31
2012/4/1 ~
2012/3/31
2010/4/1 ~
2011/3/31
パーティションのマージ
15
FG1 FG2 FG3 FG4
2009/4/1 2010/4/1 2011/4/1
2009/4/1 ~
2010/3/31
2010/4/1 ~
2011/3/31
2011/4/1 ~
~ 2009/3/31
#1 #2 #3 #4
パーティションのマージ
16
FG1 FG3 FG4
2010/4/1 2011/4/1
2010/4/1 ~
2011/3/31
2011/4/1 ~
~ 2010/3/31
ALTER PARTITION FUNCTION Table1_PF() MERGE RANGE('2009/4/1')
ALTER TABLE Table1 ADD CONSTRAINT CK_Date CHECK(Col1 >= '2010/4/1')
境界値の削除
ファイルグループの割り当て解除
#1 #2 #3
パーティションの追加
17
FG1 FG2 FG3 FG4
2009/4/1 2010/4/1 2011/4/1
2009/4/1 ~
2010/3/31
2010/4/1 ~
2011/3/31
2011/4/1 ~
~ 2009/3/31
#1 #2 #3 #4
パーティションの追加
18
FG1 FG2 FG3 FG4
2009/4/1 2010/4/1 2011/4/1
2009/4/1 ~
2010/3/31
2010/4/1 ~
2011/3/31
2011/4/1 ~
2012/3/31
~ 2009/3/31
2012/4/1
2012/4/1 ~
FG5
ALTER PARTITION SCHEME Table1_PS NEXT USED FG5
ALTER PARTITION FUNCTION Table1_PF() SPLIT RANGE ('2012/4/1')
境界値の追加
ファイルグループの追加
#1 #2 #3 #4 #5
内部動作
19
•sys.sysrowsets / sys.sysschobjs / sysrowsetrefs / sysidxstats / sys.sysallocunits / sys.sysrscols の変更
•スイッチ先に非クラスター化インデックスが存在しない場合は、非クラスター化インデックスの割り当て解除 ( PFS /
GAM / IAM の解放)
スイッチ
•sys.sysclsobjs / sys.sysobjvalues / sys.syssingleobjrefs / sys.sysrscols / sys.sysallocunits / sys.sysrowsetrefs
の変更
•マージ対象のパーティションが空でない場合、マージ先のパーティションにデータを移動 (INSERT) / 元のデータの割り
当て解除 (GAM / PFS / IAM の解放)
マージ
•パーティション構成の変更
•sys.syssingleobjrefs の変更
•パーティション関数の変更
•sys.sysclsobjs / sys.sysobjvalues / sys.syssingleobjrefs / sys.sysrowsets / sys.sysallocunits / sys.sysrscols /
sys.sysschobjs / sys.sysrowsetrefs の変更
•次のパーティションに含まれるデータが格納されている場合、スプリット先のパーティションにデータを移動
(INSERT) / 元のデータを削除 (DELETE)
パーティションの追加
SQL Server 2012 のパーティションの特徴
20
15,000 のパーティションに分割することが可能 SQL Server 2008 SP2 / SQL Server 2008 R2 SP1 も同等
これ以外のバージョンは 1,000 まで
パーティション内の操作が複数スレッドで動作 SQL Server 2005 ではパーティション内の操作は単一スレッドで動作していた
パーティション テーブルとパーティション インデックスに対するクエリ処理の機能強化 http://msdn.microsoft.com/ja-jp/library/ms345599(SQL.105).aspx
SQL Server 2005 SQL Server 2012
5 パーティション操作に 10 スレッド使用
5 パーティション操作に 5 スレッド使用
パーティションのメリット
21
パーティションのメリット
22
•パーティションをスイッチすることで大量のデータを瞬時にベーステーブルから切り離すことができる
•不要データがベーステーブルからなくなることで検索時のレスポンス向上 / インデックスメンテナンス時間の
短縮
大量データの瞬時アーカイブ
•パーティション単位でインデックスの再構築 (REBUILD) / 再構成 (REORGANIZE)
•パーティション単位でデータ圧縮が可能
•パーティション単位でバックアップ / リストア (パーティション = ファイルグループ)
•1 ファイルグループでパーティションを作成している場合はパーティション単位でバックアップは不可
パーティション単位のメンテナンス
•ロックエスカレーション発生時にテーブルロックではなくパーティションロックにすることができる
•ACCESS_METHODS_HOBT_VIRTUAL_ROOT (内部 B-Tree のルート ページの抽象化のための同期) Latch
Wait の減少
同時実行性の向上
パーティション単位の操作
23
•ALTER INDEX CI_Table1 ON Table1 REBUILD PARTITION=ALL
•ALTER INDEX CI_Table1 ON Table1 REBUILD PARTITION=1
インデックスメンテナンス
•ALTER INDEX CI_Table1 ON Table1 REBUILD PARTITION= ALL WITH
(DATA_COMPRESSION = PAGE)
•ALTER INDEX CI_Table1 ON Table1 REBUILD PARTITION=1 WITH
(DATA_COMPRESSION = PAGE)
データ圧縮
•ALTER TABLE Table1 SET (LOCK_ESCALATION = TABLE)
•ALTER TABLE Table1 SET (LOCK_ESCALATION = AUTO)
ロックエスカレーション
デモ
24