SQL Serverデータアクセスの基本動作
荒ぶった方法で確認してみよう
SQLTO 小澤 真之
自己紹介


普段は SQL Server の案件を中心に仕事をしています


企業内に設置するオンプレミス環境の SQL Server を使用した案件に携わる
機会が多いです。




SQL Server のコミュニティ SQLTO と Windows Azure のコミュニティ
JAZUG に参加させていただいています。






本日は 2 セッション担当させていただきますが、SQL Server が本職です

JAZUG 名古屋支部ができました!! 皆様よろしくお願いいたします。

ブログ : SE の雑記 (http://engineermemo.wordpress.com)
Twitter : @Masayuki_Ozawa
Facebook : masayuki.ozawa
2

NAWA Tech

2013/07/13
昔このような話ありませんでした??
ブラック縄神君

SQL Server の内部はブラックボックスで
詳細な内部情報見れないんでしょ??
¥

¥

クマー!!
(訳:そんなことはない!!)

DBA の縄神君
3

NAWA Tech

2013/07/13
本日のお題
 SQL Server ってブラックボックス??
そういうことを言うと「縄神様が

あらぶります」
そんなことはないということを
基本動作を例にどこまで見れるか
やってみようのコーナーです。
¥

4

NAWA Tech

2013/07/13
SQL Server の基本操作
④クライアントに結果を返す
SQL Server

③メモリ上のデータ操作

データベース
クライアント

①処理要求

②先行ログ書き込み

メモリ
データファイル
(mdf)

ログファイル
(ldf)

5

NAWA Tech

③’メモリとディスク上のデータ操作

2013/07/13
先行ログ書き込み (Write Ahead Log:WAL)


データの変更が発生した場合、最初の書き込みはデータファイルでは
なく、ログファイルに対して 先行 して行われる。



先行ログ書き込みにより、変更内容の履歴が最初に担保される
ログレコードには書き込まれているがデータファイルには書き込まれていない
という状態が発生する。
SQL Server
データベース

データファイル
(mdf)

先行ログ書き込み
ログファイル
(ldf)

6

NAWA Tech

2013/07/13
DEMO
 ログレコードってどういうもの??
 ログレコードを取得する関数で確認

7

NAWA Tech

2013/07/13
チェックポイント



ログレコードに書き込まれたデータの変更は最初はメモリ上のデータ
に適用される
チェックポイント の発生時にデータファイルに書き込まれる。


チェックポイントの発生タイミングは復旧間隔で調整。
デフォルト設定だと大体 60 秒に一度発生
データベース
メモリ
データファイル
(mdf)

ログファイル
(ldf)

8

チェックポイント発生時に
メモリのデータをデータファイルに書き戻し
NAWA Tech

2013/07/13
DEMO
 データファイルに書き込まれていないデータ

量って確認できる??

 動的管理ビューで状態を確認

 バイナリエディタでデータファイルを開いてみ

る
 ロールフォワードの確認
 ERRORLOG
9

/ データファイルを再確認
NAWA Tech

2013/07/13
メモリ上からデータが退避



メモリは有限のリソースであるため、データベースのサイズが大きい
場合にはすべてのデータをキャッシュしておくことはできない
メモリが不足した場合は参照頻度の低いデータをキャッシュアウト

データベース

メモリ

データファイル
(mdf)

ログファイル
(ldf)

10

メモリにないデータはディスクから読み込まれる
メモリが枯渇した場合は参照頻度の低いデータが
メモリからキャッシュアウトされる
NAWA Tech

2013/07/13
DEMO
 参照回数って本当に持っているの??
 ページの実情報で確認してみる

11

NAWA Tech

2013/07/13
先行読み取り (Read Ahead)


データの取得を行う際には、対象のデータだけでなくデータベースエ
ンジンが、必要となると思われる先のデータについても読み込みを行
う。


Enterprise Edition のほうがより多くのページを先行して読み取る


非クラスターインデックスからベーステーブルのプレフェッチの数が多い

ページ

Col1
1 ~ 10

SELECT* FROM NAWA
WHERE Col1 BETWEEN 0 AND 10

Col1
11 ~ 20

Col1
21 ~ 21

先行読み取り
12

NAWA Tech

2013/07/13
先行読み取りを確認
 先行読み取りって本当に行われているの??
 クエリで読み取られるページの状況を確認

13

NAWA Tech

2013/07/13
インデックスの構造



インデックスはツリー構造 (B-tree : Balanced Tree) で管理
インデックスのページはそれぞれが格納するデータ範囲と前後のペー
ジ情報でツリー構造を管理している
B-Tree
ルートノード

中間ノード

リーフノード

14

NAWA Tech

2013/07/13
インデックスの種類


クラスター化インデックス





テーブルに 1 個のみ設定できるインデックス
テーブルにデータを格納する際にどの項目順で格納をするか制御

非クラスター化インデックス




テーブルに 999 個 設定できるインデックス
インデックスに設定した列だけで SELECT ができる場合はそのインデックスのみで処理
がされるが、インデックスに含まれていない列が必要になった場合はクラスター化イン
デックスからデータを取得する
非クラスター化インデックス

クラスター化インデックス

15

NAWA Tech

2013/07/13
DEMO
 インデックスって本当にツリー構造に
なっているの??
 動的管理ビューで見てみる
 クラスター化インデックスと
 非クラスター化インデックスの違い
16

NAWA Tech

2013/07/13
ページの断片化




ページに空きがなくなるとデータが追加できなくなる
ページの最後に格納するデータであれば新規ページを追加してデータを格納すれば
よいが、既存ページ内にデータを格納する必要がある場合はページを分割して空き
を作る必要がある


50 / 50 分割

11

17

10
20
30
40
50
60
70
80
90
100

10
11
20
30
40

NAWA Tech

50
60
70
80
90
100

2013/07/13
DEMO
 ページ分割って本当に

50% / 50% に

分かれるの??

 ページの実情報で確認してみる

18

NAWA Tech

2013/07/13
まとめ





SQL Server の内部情報はいろいろとみることができます。
今回はデータ構造に関しての内容を主に紹介しましたが他にもメモリ
の情報や CPU (スケジューラー) の情報を詳細に取得することもでき
ます。
実際の動作を概念として理解していた場合、その実動作を負うことも
可能です。

 SQL

19

Server の情報は確認できる!!
NAWA Tech

2013/07/13

Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう