More Related Content More from Masayuki Ozawa (20) Sql server パーティション 概要4. はじめに
パーティションは Enterprise Edition / Datacenter
Edition で使用できる機能です
Standard Edition では使用できません
Enterprise Edition 以上の機能なので
「データ圧縮」
「オンラインインデックス操作」
「Column Store Index」
と併用することができます。
Enterprise Edition 特有の動作
並列インデックス操作
先行読み取り時のページ数の増加
拡張スキャン (メリーゴーラウンドスキャン)
パーティションのメンテナンス作業が必要になるため
データベースエンジニアがいない企業様での運用お勧め
しません
4
5. パーティションの一般的な種類
レンジパーティション
• 列の値の範囲に基づきデータを格納する領域を分散させる
SQL Server で使用できる
パーティションの方式: 2010/4/1 ~ 2011/3/31 → 格納領域 A
• 登録日時
• 登録日時 : 2011/4/1 ~ 2012/3/31 → 格納領域 B
ハッシュパーティション
• データのハッシュ値に基づきデータを格納する領域を分散させる
• データのハッシュ値 : A → 格納領域 A SQL Server でも
レンジパーティションを
• データのハッシュ値 : B → 格納領域 B 応用して実装することは可能
5
6. 通常のテーブルの基本構成
データベース
テーブル
ファイルグループ
(PRIMARY)
2010 年度の データファイル 1
データ (mdf)
データファイル 2
2011 年度の (ndf)
データ
テーブルは一つのファイル データファイル 3
グループに所属し複数の (ndf)
2012 年度の ファイルグループには
所属できない
データ
6
7. パーティションテーブルの基本構成
データベース
テーブル
テーブルが複数のファイル ファイルグループ 1
2010 年度の グループに関連つき、デー データファイル 2
データ タの範囲により厳密にデー
(ndf)
タがファイルグループに
結びつく。
ファイルグループ 2
2011 年度の データファイル 3
データ (ndf)
単一のDB / テーブルで
データの格納領域を ファイルグループ 3
厳密に水平分割する
2012 年度の データファイル 4
データ (ndf)
7
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
8
9. パーティション構成概要 パーティション関数
2009/4/1 2010/4/1 2011/4/1
2009/4/1 2010/4/1 2011/4/1
~
~ ~ ~
2009/3/31
2010/3/31 2011/3/31
FG1 FG2 FG3 FG4
パーティション構成
9
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
10
11. パーティションの操作
スイッチ
• 特定のパーティションを他のテーブルに切り離すことで瞬時にデータを削除する
• スイッチは空のパーティションに対して実行する必要があるため、スイッチ先にデー
タが入っている場合はスイッチすることができない
• 同一のファイルグループ内でのみスイッチができる
• パーティションの切り替えを使用した効率的なデータの転送
http://msdn.microsoft.com/ja-jp/library/ms191160(SQL.105).aspx
マージ
• 境界値を削除し、パーティション同士を結合する
パーティションの追加
• パーティション構成 / パーティション変数を変更し新規のデータ格納領域を追加する
11
12. パーティションのスイッチ
スイッチ元テーブル
#1 #2 #3 #4
FG1 FG2 FG3 FG4
~ 2009/4/1 2010/4/1 2012/4/1
2009/3/31 ~ ~ ~
2010/3/31 2011/3/31 2012/3/31
スイッチ先テーブル
12
13. パーティションのスイッチ
スイッチ元テーブル (BaseTable)
#1 #2 #3 #4
FG1 FG2 FG3 FG4
~ 2010/4/1 2012/4/1
2009/3/31 ~ ~
2011/3/31 2012/3/31
2009/4/1
~
2010/3/31
スイッチ先テーブル (ArchiveTable)
同一ファイルグループ内で
ポインタを付け替えデータを移動
ALTER TABLE BaseTable
SWITCH PARTITION 2 TO ArchiveTable PARTITION 2
13
14. ベーステーブルにインデックスを固定化
パーティションテーブル
FG1 FG2 FG3 FG4
~ 2009/4/1 2010/4/1 2012/4/1
2009/3/31 ~ ~ ~
2010/3/31 2011/3/31 2012/3/31
2009/4/1 2010/4/1 2012/4/1
~
~ ~ ~
2009/3/31
2010/3/31 2011/3/31 2012/3/31
パーティションインデックス
テーブルとインデックスを同一のパーティションに配置することでスイッチ時にインデッ
クスの構成を保ったまま切り離すことができる
パーティション インデックスの専用ガイドライン
http://msdn.microsoft.com/ja-jp/library/ms187526(SQL.105).aspx
14
15. パーティションのマージ
2009/4/1 2010/4/1 2011/4/1
#1 #2 #3 #4
2009/4/1 2010/4/1 2011/4/1
~
~ ~ ~
2009/3/31
2010/3/31 2011/3/31
FG1 FG2 FG3 FG4
15
16. パーティションのマージ
境界値の削除 2010/4/1 2011/4/1
#2 #3
#1
2010/4/1 2011/4/1
~
~ ~
2010/3/31
2011/3/31
ファイルグループの
割り当て解除
FG1 FG3 FG4
ALTER PARTITION FUNCTION Table1_PF() MERGE RANGE('2009/4/1')
ALTER TABLE Table1 ADD CONSTRAINT CK_Date CHECK(Col1 >= '2010/4/1')
16
17. パーティションの追加
2009/4/1 2010/4/1 2011/4/1
#1 #2 #3 #4
2009/4/1 2010/4/1 2011/4/1
~
~ ~ ~
2009/3/31
2010/3/31 2011/3/31
FG1 FG2 FG3 FG4
17
18. パーティションの追加
境界値の追加
2009/4/1 2010/4/1 2011/4/1 2012/4/1
#1 #2 #3 #4 #5
2009/4/1 2010/4/1 2011/4/1
~ 2012/4/1
~ ~ ~
2009/3/31 ~
ファイルグループ
2010/3/31 2011/3/31 2012/3/31 の追加
FG1 FG2 FG3 FG4 FG5
ALTER PARTITION SCHEME Table1_PS NEXT USED FG5
ALTER PARTITION FUNCTION Table1_PF() SPLIT RANGE ('2012/4/1')
18
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)
19
20. SQL Server 2012 のパーティションの特徴
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
5 パーティション操作に
5 スレッド使用 5 パーティション操作に
10 スレッド使用
SQL Server 2005 SQL Server 2012
20
22. パーティションのメリット
大量データの瞬時アーカイブ
•パーティションをスイッチすることで大量のデータを瞬時にベーステーブルから切り離すことができる
•不要データがベーステーブルからなくなることで検索時のレスポンス向上 / インデックスメンテナンス時間の
短縮
パーティション単位のメンテナンス
•パーティション単位でインデックスの再構築 (REBUILD) / 再構成 (REORGANIZE)
•パーティション単位でデータ圧縮が可能
•パーティション単位でバックアップ / リストア (パーティション = ファイルグループ)
•1 ファイルグループでパーティションを作成している場合はパーティション単位でバックアップは不可
同時実行性の向上
•ロックエスカレーション発生時にテーブルロックではなくパーティションロックにすることができる
•ACCESS_METHODS_HOBT_VIRTUAL_ROOT (内部 B-Tree のルート ページの抽象化のための同期) Latch
Wait の減少
22
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)
23