Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
SQL Server Data Page Structure
Deep Dive
Masayuki Ozawa (@Masayuki_Ozawa)
A26
自己紹介
db tech showcase 20152
 関東でフリーランスエンジニアとして SQL Server の
データベースエンジン機能を使用した案件を中心に従事
 案件等で協力できることがありましたらお声掛けいただけると幸いです
...
本日の内容
2015/9/11db tech showcase 20153
 SQL Server Data Page Structure Deep Dive
 SQL Server のデータ格納領域についてのセッション
 行ストア
*
...
データ領域の基本単位
2015/9/11db tech showcase 20154
SQL Server のデータ領域の基本単位
2015/9/11db tech showcase 20155
 ページ
 SQL Server の基本的なデータの格納単位
 Page = 8KB
 エクステント
 8KB ページを 8...
ページの基本構造 #1
2015/9/11db tech showcase 20156
ページヘッダ
データ
オフセット
8096 バイト
8192 バイト
96 バイト
レコード 1
レコード 2
レコード 3
123
行ごとの最大データ :...
ページの基本構造 #2
2015/9/11db tech showcase 20157
 各ページ間はリンク情報を持っており、自身の前後のページを把握す
ることができる。
 最初 / 最終のページについては前後のリンク情報が 0 となってい...
エクステントの基本構造
2015/9/11db tech showcase 20158
 混合エクステント
 最初は混合エクステント内に格納され、8 ページを超えるデータが格納された
場合は、以降のデータは単一エクステントとして格納される。...
ページ / エクステントを確認する方法
2015/9/11db tech showcase 20159
 DBCC PAGE
 DBCC TRACEON (3604) を実行する必要がある
 How to use DBCC PAGE
ht...
DEMO
2015/9/11db tech showcase 201510
ページとエクステントの基本構造
ページの種類
2015/9/11db tech showcase 201511
主要なページの種類
2015/9/11db tech showcase 201512
 Allocation Bitmap (Allocation Page)
 PFS : Page Free Space (ページの空き領域を管理)
 8...
Page Type
2015/9/11db tech showcase 201513
 ページの種類は Page Type という情報により管理されている
 1 - data page
 2 - index page
 3 , 4 - ...
データファイルの構造
2015/9/11db tech showcase 201514
 MDF (プライマリデータファイル)
 NDF (セカンダリデータファイル)
ページ番号 0 1 2 3 4 5 6 7 8 9
種別
File
He...
2015/9/11db tech showcase 201515
各ページの内容を確認
DEMO
インデックスの構造
2015/9/11db tech showcase 201516
クラスター化インデックスの構造
2015/9/11db tech showcase 201517
 クラスター化インデックスは階層構造のインデックス
 リーフにはデータを持つ
ルート
中間
リーフ リーフ
中間
リーフ リーフ
一意にならないクラスター化インデックス
2015/9/11db tech showcase 201518
 SQL Server ではデザイナーで主キーを設定すると、キー項目がクラスター化
インデックスとして設定される
 一意にならない列に...
非クラスター化インデックスの構造
2015/9/11db tech showcase 201519
 非クラスター化インデックスは階層構造のインデックス
 リーフにはインデックスキーのデータを持つ
 リーフにはインデックスキーのほかに行デ...
2015/9/11db tech showcase 201520
インデックス構造の確認
DEMO
ページポインター
2015/9/11db tech showcase 201521
 レコード内に他のページへのポインターを持つことがある
 BLOB データ (行外データ)
 行内データ
https://technet.microsof...
2015/9/11db tech showcase 201522
ページポインター
DEMO
断片化
2015/9/11db tech showcase 201523
 アクセス効率の低下
 ページ密度の低下
 FILL FACTOR とのトレードオフもある
 ページ連続性の低下
 シーケンシャルアクセス > ランダムアクセス...
参考)FILL FACTOR
2015/9/11db tech showcase 201524
 ページ内の空き領域を設定するための項目
 インデックスのメンテナンスをした際に設定された FILL FACTOR に応じて空き領域
を作り、新...
2015/9/11db tech showcase 201525
断片化
DEMO
最後に
2015/9/11db tech showcase 201526
さらに情報を知りたい方は
「Internals Deep Dive」
のキーワードで検索
海外の情報になりますが、
さらに詳細な情報を確認できます
Upcoming SlideShare
Loading in …5
×

[db tech showcase Sapporo 2015] A26:SQL Server Data Page Structure Deep Dive by 小澤真之(Microsoft MVP for SQL Server)

1,192 views

Published on

SQL Serverでページやエクステントという言葉を聞いたことがありますでしょうか。本セッションではSQL Serverのデータ格納領域であるページやエクステントの内部構造についてお話をさせていただきます。SQL Server のデータ格納領域について興味のある方は、ぜひご参加ください!!

Published in: Technology
  • Be the first to comment

[db tech showcase Sapporo 2015] A26:SQL Server Data Page Structure Deep Dive by 小澤真之(Microsoft MVP for SQL Server)

  1. 1. SQL Server Data Page Structure Deep Dive Masayuki Ozawa (@Masayuki_Ozawa) A26
  2. 2. 自己紹介 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 2016) 2015/9/11
  3. 3. 本日の内容 2015/9/11db tech showcase 20153  SQL Server Data Page Structure Deep Dive  SQL Server のデータ格納領域についてのセッション  行ストア * を例としたデータ格納の概念と 実際の実装を照らし合わせて確認 * 列ストア/インメモリテーブルは格納方法が異なる
  4. 4. データ領域の基本単位 2015/9/11db tech showcase 20154
  5. 5. SQL Server のデータ領域の基本単位 2015/9/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
  6. 6. ページの基本構造 #1 2015/9/11db tech showcase 20156 ページヘッダ データ オフセット 8096 バイト 8192 バイト 96 バイト レコード 1 レコード 2 レコード 3 123 行ごとの最大データ : 8,060 バイト 列ごとの最大データ : 8,000 バイト 以下のデータ型を利用した、行オーバーフローデータ(ポインターでデータをつなぐ)により、 行ごとの最大データ以上のデータを格納することも可能 (varchar /nvarchar / varbinary / sql_variant ) 8 KB を超える場合の行オーバーフロー データ https://technet.microsoft.com/ja-jp/library/ms186981(v=sql.105).aspx ページヘッダ : ページの管理情報 データ: 実レコードのデータ オフセット: レコードの位置を示す情報
  7. 7. ページの基本構造 #2 2015/9/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 = 100 m_nextPage = 0m_prevPage = 101
  8. 8. エクステントの基本構造 2015/9/11db tech showcase 20158  混合エクステント  最初は混合エクステント内に格納され、8 ページを超えるデータが格納された 場合は、以降のデータは単一エクステントとして格納される。  単一エクステント  一つのオブジェクトの情報のみが格納されたエクステント  -T 1118 は混合エクステントの利用を抑制するためのトレースフラグ エクステント テーブル A テーブル B テーブル C テーブル D テーブル A テーブル B テーブル C テーブル D エクステント テーブル A テーブル A テーブル A テーブル A テーブル A テーブル A テーブル A テーブル A
  9. 9. ページ / エクステントを確認する方法 2015/9/11db tech showcase 20159  DBCC PAGE  DBCC TRACEON (3604) を実行する必要がある  How to use DBCC PAGE http://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 Fragmenation http://blogs.msdn.com/b/timchapman/archive/2012/12/03/visualizing-index-fragmenation.aspx  SQL SERVER 2012 – sys.dm_db_database_page_allocations – dynamic management function http://raresql.com/2013/01/24/sql-server-2012-sys-dm_db_database_page_allocations-dynamic-management-function/
  10. 10. DEMO 2015/9/11db tech showcase 201510 ページとエクステントの基本構造
  11. 11. ページの種類 2015/9/11db tech showcase 201511
  12. 12. 主要なページの種類 2015/9/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 : 階層構造のインデックスページ
  13. 13. Page Type 2015/9/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
  14. 14. データファイルの構造 2015/9/11db tech showcase 201514  MDF (プライマリデータファイル)  NDF (セカンダリデータファイル) ページ番号 0 1 2 3 4 5 6 7 8 9 種別 File Header Page PFS GAM SGAM DCM BCM Boot Page ページタイプ 15 11 8 9 16 17 13 ページ番号 0 1 2 3 4 5 6 7 種別 File Header Page PFS GAM SGAM DCM BCM ページタイプ 15 11 8 9 16 17
  15. 15. 2015/9/11db tech showcase 201515 各ページの内容を確認 DEMO
  16. 16. インデックスの構造 2015/9/11db tech showcase 201516
  17. 17. クラスター化インデックスの構造 2015/9/11db tech showcase 201517  クラスター化インデックスは階層構造のインデックス  リーフにはデータを持つ ルート 中間 リーフ リーフ 中間 リーフ リーフ
  18. 18. 一意にならないクラスター化インデックス 2015/9/11db tech showcase 201518  SQL Server ではデザイナーで主キーを設定すると、キー項目がクラスター化 インデックスとして設定される  一意にならない列にクラスター化インデックスを設定するとどうなるか  4 バイトの uniqueifer 列が自動的に設定され、内部的に同一データを一意に識別され る値が付与されている  クラスタ化インデックスの設計ガイドライン https://technet.microsoft.com/ja-jp/library/ms190639(v=sql.105).aspx  2,147,483,647 件、一意にならない同一のクラスター化インデックスキー(同一キー)のデータ を挿入した例  ヒープテーブルの場合は RID (Row ID) により、行を一意に識別できる  RID : DatabaseID:FileID:PageID:Slot
  19. 19. 非クラスター化インデックスの構造 2015/9/11db tech showcase 201519  非クラスター化インデックスは階層構造のインデックス  リーフにはインデックスキーのデータを持つ  リーフにはインデックスキーのほかに行データへのリンクを持つ ルート 中間 リーフ リーフ 中間 リーフ リーフ 行データ 行データへのリンク
  20. 20. 2015/9/11db tech showcase 201520 インデックス構造の確認 DEMO
  21. 21. ページポインター 2015/9/11db tech showcase 201521  レコード内に他のページへのポインターを持つことがある  BLOB データ (行外データ)  行内データ https://technet.microsoft.com/ja-jp/library/ms189087(v=sql.100).aspx  バージョニング情報  ポインターを持つデータにアクセスした場合、複数ページのアクセスとなる  行内データのアクセスコスト / 行外データのアクセスコスト  timestamp から自身がアクセスすべき情報を取得 ページヘッダ データ オフセット レコード 1 レコード 2 レコード 3 ページヘッダ データ オフセット レコード 1 レコード 2 レコード 3
  22. 22. 2015/9/11db tech showcase 201522 ページポインター DEMO
  23. 23. 断片化 2015/9/11db tech showcase 201523  アクセス効率の低下  ページ密度の低下  FILL FACTOR とのトレードオフもある  ページ連続性の低下  シーケンシャルアクセス > ランダムアクセス  ページの連続性の低下  再構成 (REORGANIZE) / 再構築 (REBUILD)で解消  エクステントの連続性の低下  再構築で解消 (REBUILD) 50% 50% 50% 50% 100% ページ #1 ページ #2 ページ #3 Page ID 100 Page ID 890 Page ID 2000 50/50 分割 ページ連続性の低下
  24. 24. 参考)FILL FACTOR 2015/9/11db tech showcase 201524  ページ内の空き領域を設定するための項目  インデックスのメンテナンスをした際に設定された FILL FACTOR に応じて空き領域 を作り、新規のデータが挿入された場合のページ分割を抑制することができる  インデックスのメンテナンスをした際に空き領域を生成する設定であり、通常の利用時に は 100% データを格納する  FILL FACTOR を設定することでデータ追加時の 50/50 分割の発生頻度を抑えることが できるがページ密度が低下する FILL FACOTR 設定なし (既定) 100% 20% の空き領域 FILL FACOTR 80% インデックスメンテナンス後のページ密度
  25. 25. 2015/9/11db tech showcase 201525 断片化 DEMO
  26. 26. 最後に 2015/9/11db tech showcase 201526 さらに情報を知りたい方は 「Internals Deep Dive」 のキーワードで検索 海外の情報になりますが、 さらに詳細な情報を確認できます

×