SQL Server 2014
データベースエンジン新機能
小澤 真之 (@Masayuki_Ozawa)
自己紹介


フリーランスのエンジニアとして SQL Server を
中心に案件に従事



勉強会やブログで SQL Server の情報を発信






2

Twitter: @Masayuki_Ozawa
Facebook : https://www.facebook.com/masayuki.ozawa
勉強会:SQLTO (http://sqlto.net)
ブログ : SE の雑記 (http://engineermemo.wordpress.com)

SQLWorld★大阪#17

2013/09/14
はじめに

本資料は SQL Server 2014 CTP1 をベースに作成しています。
そのため、製品版では動作が変わる可能性があります。
あらかじめご了承ください。

3

SQLWorld★大阪#17

2013/09/14
本日セッションの内容


SQL Server 2014 のデータベースエンジンの以下の新機能についての紹介
クラスター化列ストアインデックス
バッファプール拡張
リソースガバナーの機能拡張



詳細については以下を参照


4

What's New (Database Engine)
http://msdn.microsoft.com/en-us/library/bb510411(v=sql.120).aspx
SQLWorld★大阪#17

2013/09/14
クラスター化列ストアインデックス

5

SQLWorld★大阪#17

2013/09/14
データのストア方法
行ストア

(Row Store)

列ストア

(Column Store)

6

SQLWorld★大阪#17

2013/09/14
行ストア (Row Store)


行を基準としたデータストア


SQL Server の通常のデータストア方法
B-Tree (Balanced Tree) 構造

ID

姓

名

1

井口

拓海

男

2

平岡

頼子

女

3

小畑

美樹

女

4

小宮

喜一郎

男

5

前川

涼子

女

ページ

性別
ルート
ノード

ID

中間
ノード

リーフ
ノード

ID

ID

ID

姓

名

性別

ID

姓

名

性別

ID

姓

名

性別

ID

姓

名

性別

1 列分のデータがほしい場合でも行単位でデータを取得する必要がある。 (正確にはページ)
7

SQLWorld★大阪#17

2013/09/14
列ストア (Column Store)


列を基準としたデータストア


SQL Server 2012 で追加された列ストアインデックス
Columnstore インデックス

ID

姓

名

性別

1

井口

拓海

男

2

平岡

頼子

女

3

小畑

美樹

女

4

小宮

喜一郎

男

5

前川

涼子

女

Segment

Segment

Segment

ID
1
2
3
4
5

姓
井口
平岡
小畑
小宮
前川

名
拓海
頼子
美樹
喜一郎
涼子

性別
男
女
女
男
女

ID

Rowgroup

Segment

姓

名

性別

内部構成

Dictionary

Segment

Rowgroup

1 列のデータがほしい場合には対象列のデータ (セグメント) のみを読み込む
8

SQLWorld★大阪#17

2013/09/14
SQL Server 2012 の列ストアインデックス


高い圧縮効率





xVelocity エンジン (旧 VertiPaq) を使用したデータの圧縮
列ストアインデックスはデータストア内のデータ型が同じであるため、効率よ
く圧縮をすることができる

読み取り専用の非クラスター化列ストアインデックスのみが設定可能



9

読み取りのみが可能であり更新 / 追加 / 削除は通常の T-SQL では行えない。
追加 / 削除に関してはパーティショニングのスイッチをすることで実施。

SQLWorld★大阪#17

2013/09/14
列ストアと
非クラスター化列ストアインデックス

DEMO

10

SQLWorld★大阪#17

2013/09/14
SQL Server 2014 の列ストアインデックス


更新可能な列ストアインデックス
(Updateable clustered columnstore indexes)



クラスター化列ストアインデックス (CCI) を使用することで更新が可能
SQL Server 2012 Parallel Data Warehouse ではすでに実装済みの機能




アーカイブデータ圧縮


列ストアインデックスに高圧縮のモード (COLUMNSTORE_ARCHIVE) を指定す
ることが可能






http://www.microsoft.com/ja-jp/sqlserver/2012/pdw/default.aspx

クラスター化 / 非クラスター化列ストアインデックスの両方に指定可能

圧縮効率は上がるが CPU 使用率も上がるので負荷とのトレードオフ

バッチモードの処理対象の追加


11

バッチモードで処理される JOIN 句が追加 等
SQLWorld★大阪#17

2013/09/14
クラスター化列ストアインデックスの構成
列ストア
Segment

Segment

Segment

ID
1
2
3
4
5

姓
井口
平岡
小畑
小宮
前川

名
拓海
頼子
美樹
喜一郎
涼子

性別
男
女
女
男
女

ID

Rowgroup

Segment

姓

名

性別

削除済み
ビットマップ

Rowgroup

行ストア
(差分ストア : Delta Store)
クラスター化列ストアインデックスで新しく追加された領域
12

SQLWorld★大阪#17

2013/09/14
作成の方法


SSMS または T-SQL で作成可能
CREATE CLUSTERED COLUMNSTORE INDEX
[ClusteredColumnStoreIndex-CCITable]
ON [dbo].[CCITable]
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE)
GO

13

SQLWorld★大阪#17

2013/09/14
行ストアを使用した更新




更新系のデータは行ストアに格納をする
追加 (INSERT) / 一括挿入 (BULKINSERT)



行ストアに追加されたデータを格納
100 万行単位で格納しそれ以上になった場合はそれまでの行ストアを圧縮して、新規の行
ストアを追加




行ストアを CLOSED にしバックグラウンドジョブ (既定で 5 分間隔) で圧縮 (COMPRESSED)

削除 (DELETE)


列ストア内のデータの削除については削除用のビットマップを設定
行ストアのデータの削除についてはストアからデータを削除



削除と追加を組み合わせる





更新 (UPDATE)





削除用のビットマップを設定
行ストアにデータを追加

検索 (SELECT)


14

列ストアと行ストアのデータを結合して使用
SQLWorld★大阪#17

2013/09/14
インデックスのメンテナンス


インデックスの再構成 (REORGANIZE)




CLOSED となった行ストアをバックグラウンドジョブの開始を待たずに圧縮

インデックスの再構築 (REBUILD)




15

オフライン再構築のみ可能 (オンライン再構築は不可)
行ストアと列ストアの内容をマージしインデックス全体を最適化
列ストア内の削除済ビットマップが設定されているデータを削除

SQLWorld★大阪#17

2013/09/14
クラスター化列ストアインデックス

DEMO

16

SQLWorld★大阪#17

2013/09/14
バッファプール拡張

17

SQLWorld★大阪#17

2013/09/14
データのキャッシュアウト



メモリのサイズは有限で一般的にはデータベースサイズより小さい
メモリ上にデータが格納できなくなった場合は、参照回数の少ない
ページをメモリ上からキャッシュアウトさせ領域を確保




他のプロセスでメモリが必要になった場合は、大量のメモリをページアウトさ
せることがある。
→ ワーキングセットのトリミング

再度データが必要になった場合はディスクからデータを読み込む


18

低速なディスクからの読み込みはオーバーヘッドがある

SQLWorld★大阪#17

2013/09/14
ページの構造
バッファヘッダ
(参照状況 : breferences)
8KB ページ
ページヘッダ
ページ
オフセット

19

SQLWorld★大阪#17

2013/09/14
データの参照回数の確認

DEMO

20

SQLWorld★大阪#17

2013/09/14
バッファプール拡張


高速なディスクをキャッシュとして利用し階層化 (L2 キャッシュ)




キャッシュアウトが発生した場合に、高速なディスク (SSD) にデータを
キャッシュアウトさせ、再度読み込みが発生した場合はそこからデータを読
み込む






ディスクに書き込むオーバーヘッドがあるため、キャッシュに使用するディスクに
よっては全体のスループットへの影響が懸念される (個人的な感想)

Max Server Memory = 128 GB まで
バッファプール拡張の最大サイズは Max Server Memory の 32 倍まで
有効 / 無効化はオンラインでできるが、サイズを小さくしたい場合は、サービスの再
起動が必要となることがある

Buffer Pool Extension
http://msdn.microsoft.com/en-us/library/dn133176(v=sql.120).aspx
データベース
(mdf / ndf)

21

メモリ
(L1 キャッシュ)

SQLWorld★大阪#17

SSD
(L2 キャッシュ)

2013/09/14
設定方法


バッファプール拡張はデータベース単位ではなくインスタンス単位で設定をする


有効化




無効化


22

ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
(FILENAME = 'F:¥ExtendPool¥ExtendPool.BPE', SIZE = 20GB)

ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION OFF

SQLWorld★大阪#17

2013/09/14
利用状況の取得方法



キャッシュされているデータがメモリ / 拡張領域のどちらに格納されている
かを DMV / 拡張イベント / パフォーマンスモニターから取得可能
DMV


sys.dm_os_buffer_descriptors


従来から存在していた DMV が拡張








sys.dm_os_buffer_pool_extension_configuration
buffer_pool_eviction_thresholds_recalculated
buffer_pool_extension_pages_evicted
buffer_pool_extension_pages_read
buffer_pool_extension_pages_written



SQLServer:Buffer Manager

拡張イベント





パフォーマンスモニター


23

Extension ~ 系のカウンターが追加

SQLWorld★大阪#17

2013/09/14
バッファプール拡張

DEMO

24

SQLWorld★大阪#17

2013/09/14
リソースガバナーの機能拡張

25

SQLWorld★大阪#17

2013/09/14
リソースガバナー


SQL Server 2008 で追加されたリソースを制御するための機能



リソース : CPU / メモリ
リソースプール : 使用するリソースの上限





MIN_CPU_PERCENT / MAX_CPU_PERCENT / MIN_MEMORY_PERCENT /
MAX_MEMORY_PERCENT

ワークロードグループ : リソースプールのリソースの利用の許可割合
分類子関数 : どのワークロードグループに割り当てるかを制御
リソースプール
ワークロードグループ
接続

分類子関数

ワークロードグループ
26

SQLWorld★大阪#17

2013/09/14
機能拡張


SQL Server 2012


CAP_CPU_PERCENT





CPU の利用上限を厳密に設定することができるようになった
以前のバージョンの CPU 制限は負荷が低いときは制限を超えて利用できた

SQL Server 2014


MAX_IOPS_PER_VOLUME / MIN_IOPS_PER_VOLUME





27

ディスクボリューム単位に IOPS が設定できるようになった
ディスク負荷に余裕がある (低い) 場合でも上限値で制御がされる

ALTER RESOURCE POOL (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/bb934024(v=sql.120).aspx
SQLWorld★大阪#17

2013/09/14
設定方法


現状は GUI からは設定できないため、クエリから設定をする





CAP_CPU_PERCENT もクエリからのみ設定可能
CREATE RESOURCE POOL [IOLimit] WITH
(CAP_CPU_PERCENT = 100,
MAX_IOPS_PER_VOLUME = 50,
MIN_IOPS_PER_VOLUME = 50)

設定後の確認も GUI からはできないため設定状況は
sys.resource_governor_resource_pools で確認

28

SQLWorld★大阪#17

2013/09/14
I/O の制御状態の確認


SQLServer:Resource Pool Stats の項目が拡張されている







29

Disk Read Bytes/sec
Disk Read IO Throttled/sec
Disk Read IO/sec
Disk Write Bytes/sec
Disk Write IO Throttled/sec
Disk Write IO/sec

SQLWorld★大阪#17

2013/09/14
参考) Hyper-V のリソース制御

Widnows Server 2012 から
N/W の帯域制御が可能

30

SQLWorld★大阪#17

Widnows Server 2012 R2 から
ディスクの IOPS の制御が可能

2013/09/14
リソースガバナーの機能拡張

DEMO

31

SQLWorld★大阪#17

2013/09/14
その他の機能拡張

32

SQLWorld★大阪#17

2013/09/14
その他の機能


並列 SELECT INTO




SELECT INTO を並列スレッドで実行できるようになった (Parallel INSERT)

データベースでの基数の推定


データの基数の推定ロジックが先行して実装されていた SQL Database と同じになった







Windows Azure SQL データベースでの基数の推定
http://msdn.microsoft.com/ja-jp/library/dn369871.aspx
SQL 2014 New Cardinality Estimator
http://www.sqlstash.com/2013/06/28/sql-2014-cardinality-estimator/

AlwasyOn 可用性グループの機能拡張





無効化するには TF 2312 + TF 9481 を使用

最大で 9 台構成 (プライマリ 1 台 + セカンダリ 8 台で構成可能)
クラスタークォーラムが損失している状態でのセカンダリの利用

Windows Azure との相互利用



Windows Azure VM にバックアップしたデータベースを展開してインスタンスを作成
Windows Azure VM とオンプレミスで AlwaysOn 可用性グループを構築


33

Azure の VPN の機能と組み合わせて利用

SQLWorld★大阪#17

2013/09/14

SQL Server 2014 データベースエンジン新機能