参考資料
Å
Å
Å
Å
Å
Database Design and Implementatio
詳説データベー3
データ指向アプリケーションデザイF
各種Spannerドキュメン0
ネットの海に落ちているQiita/Zenn
これをベースに話します
[Database Design and Implementation : Sciore, Edward]
(https://www.amazon.co.jp/-/en/Edward-Sciore-ebook/dp/B085DZM79S)
*本書固有の命名については 色で記載
オレンジ
なぜメモリ管理?
H ディスクアクセスはメモリアクセスに比べて格段に遅8
H HDDで約10万倍、SSDでも100~1000倍 ほ#
H 基本的にはオンメモリで処理すればするほど高速にな
H しかし、メモリは揮発性
Slide 13
Slide 13 text
なぜメモリ管理?
H ディスクアクセスはメモリアクセスに比べて格段に遅8
H HDDで約10万倍、SSDでも100~1000倍 ほ#
H 基本的にはオンメモリで処理すればするほど高速にな
H しかし、メモリは揮発性
大事なのは..
H いかに賢くメモリを使う
H いつメモリからファイルに書き込む(永続化)するか
モチベーション
「ACID特性」を満たしたR
I Atomicity(原子性): 全ての操作が全体として成功するか、全て失敗することを保y
I
I
I Durability(永続性): トランザクションが確定(コミット)された後は、その変更が
永続的に保持される
Consistency(一貫性): データベースの状態が常に整合性を保f
Isolation(独立性): 他のトランザクションは、現在進行中のトランザクションに影
響を与えなR
Slide 22
Slide 22 text
モチベーション
「ACID特性」を満たしたR
I Atomicity(原子性): 全ての操作が全体として成功するか、全て失敗することを保y
I
I
I Durability(永続性): トランザクションが確定(コミット)された後は、その変更が
永続的に保持される
Consistency(一貫性): データベースの状態が常に整合性を保f
Isolation(独立性): 他のトランザクションは、現在進行中のトランザクションに影
響を与えなR
→「リカバリー」が実現できれば良い
リカバリー( )
RecoveryMgr
そもそも..S
Y トランザクション実行時にはログを記録してお1
Y Star@
Y SetXX#
Y Commit / RollbacV
Y Checkpoint
ログの例
Database Design and Implementation p.11より引用
WAL(Write Ahead Log)
g Spanner の内部サーバーも WAL を使っていC
g PostgreSQL には WAL を無効にすることでパフォーマンスを上げるオプションがあっ
たりすC
g [spanner-osdi2012.pdf](https://static.googleusercontent.com/media/research.google.com/ja//archive/spanner-osdi2012.pdf
g [WALの設定](https://www.postgresql.jp/docs/9.4/wal-configuration.html
g
なお、耐障害性
マルチバージョン同時実行制御(MVCC)
d 最新のデータを読もうとするからロックが発生す
d 古いデータの読み取りではロックが発生しなa
d Spanner における Staleness Rea9
d 内部的には複数のバージョンのデータを保持することで実現
データのバージョン, トランザクションの前後関係の判定には
タイムスタンプで使われることが多い
フォーマット
p レコードは削除されることもあd
p レコードが削除されても周りのデータを動かしたくない(大規模な移動になるため@
p 時間が経つと「虫食い」なストレージ状況になりかねない
→定期的にデータを配置し直すことで効率的なストレージ状況を実現
未使用スペース
Database Design and Implementation p.168より引用
Plan
クエリの“実行計画”を立て$
! 実行計画は複数ありえ$
! その中で”最適な”実行計画を選#
! データアクセスはせず、推定のみ
→メタデータを元に判断
スキャンごとのコスト評価
Parse→ →Scan
Plan
Database Design and Implementation p.268より引用
Slide 50
Slide 50 text
Scan
各種演算子ごとに Scan が実装される
例えば..@
(行から列の絞り込み
(行の絞り込み
(2テーブルの直積結果を返す)
これらを組み合わせてクエリを処理する
s ProjectScan
s SelectScan
s ProductScan
Select SName
From STUDENT
Where GradYear = 2020
and MajorId = 10
Parse→Plan→Scan
スキャンツリー
Database Design and Implementation p.227より引用
クエリ実行までの流れ
クエリ文字列 クエリデータ 実行計画 実行
実行
Parse Plan Scan
Slide 55
Slide 55 text
クエリ実行までの流れ
「クエリ実行」の中で..l
h レコードごとに処理(スキーマのおかげでNレコード目の場所がわかるk
h ロックを使って並行制d
h 変更はログ書き込み→メモリ反映→ファイル反映で永続
h 高速に処理するために、メモリを賢く活用
参考実装: https://github.com/kj455/simple-db-go (スターくれると嬉しいです)
Slide 56
Slide 56 text
参考資料
d [Database Design and Implementation: Second Edition](https://www.amazon.co.jp/-/en/Edward-Sciore/dp/3030338355
d [詳説 データベース - O'Reilly Japan](https://www.oreilly.co.jp/books/9784873119540/
d [データ指向アプリケーションデザイン - O'Reilly Japan](https://www.oreilly.co.jp/books/9784873118703/
d [Spanner: Google's Globally-Distributed Database](https://static.googleusercontent.com/media/research.google.com/ja//archive/spanner-osdi2012.pdf
d [Cloud Spanner におけるトランザクションのロックについて | Google Cloud 公式ブログ](https://cloud.google.com/blog/ja/products/databases/transaction-
locking-in-cloud-spanner
d [Spanner: TrueTime と外部整合性 | Google Cloud](https://cloud.google.com/spanner/docs/true-time-external-consistency?hl=ja
d [Cloud Spanner を使って様々な Anomaly に立ち向かう | by Yuki Furuyama | google-cloud-jp | Medium](https://medium.com/google-cloud-jp/cloud-spanner-
%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%A7%98%E3%80%85%E3%81%AA-anomaly-
%E3%81%AB%E7%AB%8B%E3%81%A1%E5%90%91%E3%81%8B%E3%81%86-5132f691ccf4
d [データベース(RDB)を理解できるようになる動画 / UUIDを主キーにすると遅い?](https://www.youtube.com/watch?v=ifnszOLLgjs&t=627s)