sql server パーティション 概要

24
SQL Server パーティション 概要 小澤 真之 (@Masayuki_Ozawa) http://engineermemo.wordpress.com

Upload: masayuki-ozawa

Post on 27-Jun-2015

6.570 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Sql server パーティション 概要

SQL Server パーティション 概要

小澤 真之 (@Masayuki_Ozawa)

http://engineermemo.wordpress.com

Page 2: Sql server パーティション 概要

パーティションの基本構成

パーティションのメリット

デモ

本日の Agenda

2

Page 3: Sql server パーティション 概要

パーティションの基本構成

3

Page 4: Sql server パーティション 概要

はじめに

4

パーティションは Enterprise Edition / Datacenter Edition で使用できる機能です Standard Edition では使用できません Enterprise Edition 以上の機能なので

「データ圧縮」 「オンラインインデックス操作」 「Column Store Index」 と併用することができます。

Enterprise Edition 特有の動作 並列インデックス操作 先行読み取り時のページ数の増加 拡張スキャン (メリーゴーラウンドスキャン)

パーティションのメンテナンス作業が必要になるためデータベースエンジニアがいない企業様での運用お勧めしません

Page 5: Sql server パーティション 概要

パーティションの一般的な種類

5

• 列の値の範囲に基づきデータを格納する領域を分散させる

• 登録日時 : 2010/4/1 ~ 2011/3/31 → 格納領域 A

• 登録日時 : 2011/4/1 ~ 2012/3/31 → 格納領域 B

レンジパーティション

• データのハッシュ値に基づきデータを格納する領域を分散させる

• データのハッシュ値 : A → 格納領域 A

• データのハッシュ値 : B → 格納領域 B

ハッシュパーティション

SQL Server で使用できるパーティションの方式

SQL Server でも レンジパーティションを

応用して実装することは可能

Page 6: Sql server パーティション 概要

通常のテーブルの基本構成

6

テーブル

2010 年度の データ

2011 年度の データ

2012 年度の データ

データベース

ファイルグループ (PRIMARY)

データファイル 1

(mdf)

データファイル 2 (ndf)

データファイル 3 (ndf)

テーブルは一つのファイルグループに所属し複数のファイルグループには

所属できない

Page 7: Sql server パーティション 概要

パーティションテーブルの基本構成

7

テーブル

2010 年度の データ

2011 年度の データ

2012 年度の データ

データベース

ファイルグループ 1

データファイル 2 (ndf)

ファイルグループ 2

データファイル 3 (ndf)

ファイルグループ 3

データファイル 4 (ndf)

テーブルが複数のファイルグループに関連つき、データの範囲により厳密にデータがファイルグループに

結びつく。

単一のDB / テーブルで データの格納領域を 厳密に水平分割する

Page 8: Sql server パーティション 概要

パーティションの構成

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

パーティション構成

Page 9: Sql server パーティション 概要

パーティション構成概要

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

パーティション関数

パーティション構成

Page 10: Sql server パーティション 概要

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

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

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

Page 11: Sql server パーティション 概要

パーティションの操作

11

•特定のパーティションを他のテーブルに切り離すことで瞬時にデータを削除する

•スイッチは空のパーティションに対して実行する必要があるため、スイッチ先にデー

タが入っている場合はスイッチすることができない

•同一のファイルグループ内でのみスイッチができる

•パーティションの切り替えを使用した効率的なデータの転送

http://msdn.microsoft.com/ja-jp/library/ms191160(SQL.105).aspx

スイッチ

•境界値を削除し、パーティション同士を結合する

マージ

•パーティション構成 / パーティション変数を変更し新規のデータ格納領域を追加する

パーティションの追加

Page 12: Sql server パーティション 概要

パーティションのスイッチ

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

Page 13: Sql server パーティション 概要

パーティションのスイッチ

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

Page 14: Sql server パーティション 概要

ベーステーブルにインデックスを固定化

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

Page 15: Sql server パーティション 概要

パーティションのマージ

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

Page 16: Sql server パーティション 概要

パーティションのマージ

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

Page 17: Sql server パーティション 概要

パーティションの追加

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

Page 18: Sql server パーティション 概要

パーティションの追加

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

Page 19: Sql server パーティション 概要

内部動作

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)

パーティションの追加

Page 20: Sql server パーティション 概要

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 スレッド使用

Page 21: Sql server パーティション 概要

パーティションのメリット

21

Page 22: Sql server パーティション 概要

パーティションのメリット

22

•パーティションをスイッチすることで大量のデータを瞬時にベーステーブルから切り離すことができる

•不要データがベーステーブルからなくなることで検索時のレスポンス向上 / インデックスメンテナンス時間の

短縮

大量データの瞬時アーカイブ

•パーティション単位でインデックスの再構築 (REBUILD) / 再構成 (REORGANIZE)

•パーティション単位でデータ圧縮が可能

•パーティション単位でバックアップ / リストア (パーティション = ファイルグループ)

•1 ファイルグループでパーティションを作成している場合はパーティション単位でバックアップは不可

パーティション単位のメンテナンス

•ロックエスカレーション発生時にテーブルロックではなくパーティションロックにすることができる

•ACCESS_METHODS_HOBT_VIRTUAL_ROOT (内部 B-Tree のルート ページの抽象化のための同期) Latch

Wait の減少

同時実行性の向上

Page 23: Sql server パーティション 概要

パーティション単位の操作

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)

ロックエスカレーション

Page 24: Sql server パーティション 概要

デモ

24