Upload
masayuki-ozawa
View
3.741
Download
1
Embed Size (px)
Citation preview
自己紹介
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 のデータ格納領域についてのセッション
行ストアを例としたデータ格納の概念と実際
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/
主要なページの種類
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 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 201521
レコード内に他のページへのポインターを持つことがある BLOBデータ (行外データ)
行内データhttps://technet.microsoft.com/ja-jp/library/ms189087(v=sql.100).aspx
バージョニング情報
ポインターを持つデータにアクセスした場合、複数ページのアクセスとなる 行内データのアクセスコスト / 行外データのアクセスコスト timestamp から自身がアクセスすべき情報を取得
ページヘッダ
データ
オフセット
レコード 1 レコード 2
レコード 3
ページヘッダ
データ
オフセット
レコード 1 レコード 2
レコード 3
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 分割 ページ連続性の低下