a25 sql server data page structure deep dive

26
SQL Server Data Page Structure Deep Dive Masayuki Ozawa (@Masayuki_Ozawa) A25

Upload: masayuki-ozawa

Post on 26-Jul-2015

3.741 views

Category:

Data & Analytics


1 download

TRANSCRIPT

SQL Server Data Page Structure

Deep Dive

Masayuki Ozawa (@Masayuki_Ozawa)

A25

自己紹介

db tech showcase 20152

フリーランスエンジニアとして SQL Server のデータベースエンジン機能を使用した案件を中心に従事 案件等で協力できることがありましたらお声掛けいただけると幸いです

「SQL Server 現状診断」による SQL Server 稼働状況の報告書作成

SQL Serverのオンサイト / オフサイトでの技術支援

コミュニティやブログで SQL Server の情報を発信

ブログ : SE の雑記 (http://blog.engineer-memo.com)

Microsoft MVP for SQL Server (July 2011 - June 2015)

2015/6/11

本日の内容

2015/6/11db tech showcase 20153

SQL Server Data Page Structure Deep Dive

SQL Server のデータ格納領域についてのセッション

行ストアを例としたデータ格納の概念と実際

データ領域の基本単位

2015/6/11db tech showcase 20154

SQL Server のデータ領域の基本単位

2015/6/11db tech showcase 20155

ページ SQL Server の基本的なデータの格納単位

Page = 8KB

エクステント 8KB ページを 8 個まとめた領域

1 Extent = 8 Page = 64KB

領域の拡張を行う場合はエクステントサイズで実施される 通常は 64KB の拡張だが、オプション (-E) を指定することで 2MB 単位にすることが可能

ページとエクステントのアーキテクチャ

https://technet.microsoft.com/ja-jp/library/cc280360(v=sql.105).aspx

ページの基本構造 #1

2015/6/11db tech showcase 20156

ページヘッダ

データ

オフセット

8096 バイト

8192 バイト

96 バイト

レコード 1レコード 2

レコード 3

123

行ごとの最大データ : 8060 バイト

行オーバーフローによりこれ以上のデータを格納することも可能(varchar /nvarchar/varbinary/sql_variant )

8 KB を超える場合の行オーバーフロー データhttps://technet.microsoft.com/ja-jp/library/ms186981(v=sql.105).aspx

ページヘッダ : ページの管理情報

データ:実レコードのデータ

オフセット:レコードの位置を示す情報

ページの基本構造 #2

2015/6/11db tech showcase 20157

各ページ間はリンク情報を持っており、自身の前後のページを把握することができる。

最初 / 最終のページについては前後のリンク情報が 0 となっている。

ページ #1 ページ #2 ページ #3

m_nextPage = 101

Page ID 100 Page ID 101 Page ID 102

m_prevPage = 0 m_nextPage = 102m_prevPage = 100m_nextPage = 0m_prevPage = 101

エクステントの基本構造

2015/6/11db tech showcase 20158

混合エクステント

最初は混合エクステント内に格納され、8 ページを超えるデータが格納された場合は、以降のデータは単一エクステントとして格納される。

単一エクステント

一つのオブジェクトの情報のみが格納されたエクステント

-T 1118 は混合エクステントの利用を抑制するためのトレースフラグ

エクステント

テーブル A テーブル B テーブル C テーブル D

テーブル A テーブル B テーブル C テーブル D

エクステント

テーブル A テーブル A テーブル A テーブル A

テーブル A テーブル A テーブル A テーブル A

ページ / エクステントを確認する方法

2015/6/11db tech showcase 20159

DBCC PAGE DBCC TRACEON (3604) を実行する必要がある

How to use DBCC PAGEhttp://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx

sys.dm_db_database_page_allocations SQL Server 2012 で追加された以下の情報を取得できる DMV

DBCC IND

DBCC EXTENTINFO

Visualizing Index Fragmenationhttp://blogs.msdn.com/b/timchapman/archive/2012/12/03/visualizing-index-fragmenation.aspx

SQL SERVER 2012 – sys.dm_db_database_page_allocations – dynamic management functionhttp://raresql.com/2013/01/24/sql-server-2012-sys-dm_db_database_page_allocations-dynamic-management-function/

DEMO

2015/6/11db tech showcase 201510

ページとエクステントの基本構造

ページの種類

2015/6/11db tech showcase 201511

主要なページの種類

2015/6/11db tech showcase 201512

Allocation Bitmap (Allocation Page) PFS : Page Free Space (ページの空き領域を管理)

8,088 ページ (64MB) ごとに存在する

GAM : Global Allocation Map (単一エクステントを管理)

SGAM : Shared Global Allocation Map (混合エクステントを管理)

DCM : Differential Changed Map (差分変更の管理情報)

BCM : Bulk Changed Map (一括変更の管理情報) GAM / SGAM / DCM / BCM は 64,000 エクステント → 4GB 分の情報を管理

IAM : Index Allocation Map (インデックスの割り当てを管理)

Data Page Data Page : リーフレベルのデータページ Index Page : 階層構造のインデックスページ

Page Type

2015/6/11db tech showcase 201513

ページの種類は Page Type という情報により管理されている 1 - data page

2 - index page

3 , 4 - text pages

8 - GAM page

9 - SGAM page

10 - IAM page

11 - PFS page

13 – Boot Page

15 – File Header Page

16 - DCM Page

17 - BCM Page

データファイルの構造

2015/6/11db tech showcase 201514

MDF (プライマリデータファイル)

NDF (セカンダリデータファイル)

ページ番号 0 1 2 3 4 5 6 7 8 9

種別File

HeaderPage

PFS GAM SGAM DCM BCMBootPage

ページタイプ 15 11 8 9 16 17 13

ページ番号 0 1 2 3 4 5 6 7

種別File

HeaderPage

PFS GAM SGAM DCM BCM

ページタイプ 15 11 8 9 16 17

2015/6/11db tech showcase 201515

各ページの内容を確認

DEMO

インデックスの構造

2015/6/11db tech showcase 201516

クラスター化インデックスの構造

2015/6/11db tech showcase 201517

クラスター化インデックスは階層構造のインデックス

リーフにはデータを持つ

ルート

中間

リーフ リーフ

中間

リーフ リーフ

一意にならないクラスター化インデックス

2015/6/11db tech showcase 201518

SQL Serverではデザイナーで主キーを設定すると、キー項目がクラスター化インデックスとして設定される

一意にならない列に対してクラスター化インデックスを設定するとどうなるか

4 バイトの uniqueifer列が自動的に設定され、内部的に一意に識別される値が付与されている

クラスタ化インデックスの設計ガイドライン

https://technet.microsoft.com/ja-jp/library/ms190639(v=sql.105).aspx

ヒープテーブルの場合は RID (Row ID) により、行を一意に識別できる

非クラスター化インデックスの構造

2015/6/11db tech showcase 201519

非クラスター化インデックスは階層構造のインデックス

リーフにはインデックスキーのデータを持つ

リーフにはインデックスキーのほかに行データへのリンクを持つ

ルート

中間

リーフ リーフ

中間

リーフ リーフ

行データ

行データへのリンク

2015/6/11db tech showcase 201520

インデックス構造の確認

DEMO

ページポインター

2015/6/11db tech showcase 201521

レコード内に他のページへのポインターを持つことがある BLOBデータ (行外データ)

行内データhttps://technet.microsoft.com/ja-jp/library/ms189087(v=sql.100).aspx

バージョニング情報

ポインターを持つデータにアクセスした場合、複数ページのアクセスとなる 行内データのアクセスコスト / 行外データのアクセスコスト timestamp から自身がアクセスすべき情報を取得

ページヘッダ

データ

オフセット

レコード 1 レコード 2

レコード 3

ページヘッダ

データ

オフセット

レコード 1 レコード 2

レコード 3

2015/6/11db tech showcase 201522

ページポインター

DEMO

FILL FACTOR

2015/6/11db tech showcase 201523

ページ内の空き領域を設定するための項目

インデックスのメンテナンスをした際に設定された FILL FACTOR に応じて空き領域を作り、新規のデータが挿入された場合のページ分割を抑制することができる インデックスのメンテナンスをした際に空き領域を生成する設定であり、通常の利用時には 100% データを格納する

FILL FACTOR を設定することでデータ追加時の 50/50 分割の発生頻度を抑えることができるがページ密度が低下する

FILL FACOTR 設定なし (既定)

100%20% の空き領域

FILL FACOTR 80%

インデックスメンテナンス後のページ密度

断片化

2015/6/11db tech showcase 201524

アクセス効率の低下 ページ密度の低下

FILL FACTOR とのトレードオフもある

ページ連続性の低下 シーケンシャルアクセス > ランダムアクセス

ページの連続性の低下 再構成 (REORGANIZE) / 再構築 (REBUILD)で解消

エクステントの連続性の低下 再構築で解消 (REBUILD)

50%

50%

50%

50%

100% ページ #1 ページ #2 ページ #3

Page ID 100 Page ID 890 Page ID 2000

50/50 分割 ページ連続性の低下

2015/6/11db tech showcase 201525

FILLFACTOR と断片化

DEMO

最後に

2015/6/11db tech showcase 201526

さらに情報を知りたい方は「Internals Deep Dive」のキーワードで検索

海外の情報になりますが、さらに詳細な情報を確認できます