1. London Tech Talk
  2. 【Bookclub 第四弾】 "Databas..
2025-01-25 23:03

【Bookclub 第四弾】 "Database Internals" #1 振り返り

spotify apple_podcasts

London Tech Talk 名物 Bookclub 第四弾 "Database Internals" 第一章の振り返り収録です。

Using EXPLAIN (PostgreSQL)

Non-volatile Memory (Wikipedia)

131. 【Bookclub 第四弾】 "Database Internals" 参加者募集のお知らせ

ご意見・ご感想など、お便りはこちらの⁠⁠⁠⁠⁠⁠⁠ ⁠⁠⁠Google Form⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠ で募集しています。

サマリー

「Database Internals」第1回では、DBMSの基本的な仕組みやアーキテクチャについて振り返ります。特に、メモリベースとディスクベースのDBMSの違いやインデックスの役割について深く掘り下げます。また、データベースインターナルズのブッククラブでは、様々なデータベースの使用状況や背景を共有し、DBMSに関する理解を深めています。さらに、OTLPやOLAP、HTAPといったデータ処理の手法についても議論されています。

DBMSの基本理解
リスナーのみなさん、こんにちは。London Tech TalkのKen Wakatamaです。
今日は、2025年に始まりまして、Bookclub 第四弾、Database Internalsをやっているんですけれども、
その第1回、Chapter 1、Introduction and Overviewを読んだ振り返り収録というのをやっていきたいと思います。
2025年も、Bookclub第四弾、できれば第五弾2つやっていきたいなと思っていて、振り返り収録も引き続きやっていこうと思っています。
時々、今回のようにソロ収録で録ったり、時々ゲストの方を呼んで、2人、3人で録ったりして、Chapterごとにやっていこうかなと思っています。
この振り返り収録の想定リスナーとしては、大体2パターンかなと思っています。
第1パターンとしては、Bookclubの参加者の方が実際に参加した後とか、今回は非同期で参加するタイムゾーンもあるので、
同期で参加できなかった方が聞いて、記憶の定着じゃないですけれども、具体的に盛り上がった議論の内容であったり、
コンテンツの本の内容をもう1回振り返ることで、新しい観点をもう1回再発見したりとか、より深く理解するきっかけになればいいかなと思っています。
想定リスナーの2つ目のパターンがですね、ロンドテイクトーク、こうしてBookclub第4弾となると、
収録に合わせて、Bookclubには参加しないんですけれども、リスナーの方の中で一緒に本を読んでくれているという方が結構いらっしゃるということを耳にしたので、
その方々とも一緒に各州で今Bookclubをやっているんですけれども、なるべくそれにキャッチアップする形で振り返り収録を発信していこうと思うので、
データベースインターナルズを読んでいる方はぜひこの振り返り収録を1つマイルストーンというか定期的なハードビートみたいな感じで、
2週間に1回目標として配信していくので、一緒に読み進めていただけるきっかけになればいいかなと思っています。
基本的には個人的なTLDRとか、あとは記憶に残っているキーワードやBookclubの中で盛り上がった観点について紹介していこうと思います。
逆に言うと本の内容をまるっと紹介するわけではもちろんないので、内容が気になる方はぜひ本を買って一緒に読んでいっていただければなと思います。
ということで、今回の第1章はイントダクション&オーバービューということで、
感想を聞いてみても割と第2章、第3章、第4章となってくると、データベースを作るB3のデータ構造の計算量ですとか、具体的なインプリメンテーションですとか、
細かいところに入っていく前の準備段階としてDBMSのジェネラルな話、ハイレベルな話というのが多かったように思います。
まずそもそもDBMS、データベースマネジメントシステムとは何ですかというところで、
今までデータベースを開発したことがない、でもSQLは書いたことあるよとか、データベースについて何度なく聞いたことあるみたいなのも想定読者に入っているので、
そういった方向けにまずそもそもDBMSがしていることは何かということで、DBMSというのはこういうものだよという説明があったりしましたね。
ここら辺はハイレベルであったもののネットワークを通じてSQLが発行されて、クエリを解釈するクエリプロセッサーがいて、
クエリの内容を実際に実行するエグゼキューションエンジンというのもいて、そのデータを実際に格納しているディスクやメモリから読み出すストレージエンジンというコンポーネントたちがいて、
今までデータベースをユーザーとして使っているとSQLを発行したらいい感じにゴニョゴニョしてデータを返してくれるというところだったんですけれども、
そのSQLを投げて結果が来るまでの裏側でトランスポートとかクエリプロセッサー、エグゼキューションエンジンとかストレージエンジンみたいなコンポーネントがあるということを理解できるというのが一つ目のゴールかなと思っています。
データ保存の派閥
例えばSQLのパフォーマンスがいまいち出ないなとかスロークエリが出るなというときに、実際どういうクエリプランが実行されているかということで、
例えばX-Planeを実行してどういった実行計画にされるかみたいなパフォーマンス改善の一環でやったことがある方もいるかもしれないんですけれども、
それはDBMSのアーキテクチャでどういうことなのか、クエリプロセッサーまでは到達しているけれども、
実際にエグゼキューションエンジンを実行することは結果を返しているんだなみたいなことがわかると、
X-Planeが実際に何をしているかというのも今後も理解できるかなと思っていたりします。
DBMSのアーキテクチャをざっくり押さえた上で、この第一章でポイントになっていた観点が大まかに言うと3つありますね。
まず1つ目が、データベースというのはデータを保存するものですけれども、
そのデータをどこに保存するかということで大きく2つの派閥がありましたと。
基本的にはディスクベースとDBMSなんですけれども、
メモリにデータを保存するメモリベースのDBMSがありますよね。
メモリベースのDBMSとディスクベースのDBMSではどういった違いがあるかというのを理解しました。
運用コストであったり、ハードウェアの購入コストであったり、
あとはマシンがクラッシュしたときにデータが揮発するかどうかであったり、
そういったいくつかの観点においてメモリベースのDBMSとディスクベースのDBMSではこんな違いがあるよということを理解しました。
ここら辺はメモリとかディスクとかを踏まえた上で、
普段自分たちが使っているDBMSがどっちの派閥に属するのかであったりとかということを踏まえながら理解できたかなと思います。
2つ目はDBMSにもいくつかあります。
マイシークレとかポスクレみたいなローオリエンティット、日本語で言うと列指向ですね。
ローは行列の列ですね。列指向のDBMS。
それから行指向のカラムオリエンティットDBMSであったりとか、
ワイドカラムストレージと呼ばれるDBMSもあり、それぞれのざっくりとした違いについても理解しました。
ここら辺結構カラムオリエンティットDBMSという言葉を初めて聞いたという方であったり、
ワイドカラムストレージについて詳しく調べてみたよという方もいらっしゃったりしたので、
結構新しいキーワードとなって何かしらテイクアウェイがある方も多かったんじゃないかなと思います。
インデックスの役割
あとは第2章からB3とかインデックスの詳細に入っていくんですけど、
そもそもインデックスって何という話がありました。
データファイルバーサスインデックスファイルのところでは、
データファイル、データベースに保存するデータ本体を、
ポスクレではヒープと言ったりしますけれども、保存するデータファイルというものと、
パフォーマンスを向上させるためにインデックスというものを作ったことがある方も多いと思うんですけれども、
インデックスファイルというのは具体的には何なのかというところを理解しました。
例えばインデックスを作るということは、データファイルを作品のように、
本のアナロジーで考えるとわかりやすいんですけれども、
例えば辞書とかをイメージしていただくとわかるんですけど、
実際の単語について書かれている本の内容自体のところがデータファイルだとすると、
例えばページとか新しい単語を調べているとすると、
Pのところまでページをめくって探さなきゃいけないですよね。
でももし作品インデックスというのがあれば、一気にページ数まで飛べますと。
このポイントは作品インデックス自体というのも形を変えた別のデータという点であることが、
ここを読んでわかったかなと思います。
本も実際に辞書とかもそうなんですけれども、
作品だけで辞書とかってなると数十ページ、
百数十ページぐらいの実際のページボリュームを使ったりしますよね。
なのでこれがわかると具体的にどういうことがわかるかというと、
例えばSQLのリードパフォーマンスを上げるためにインデックスを作ればいいということは、
SQL 101みたいなすごいビギナーズレッスンとかでやると思うんですけれども、
インデックスを作りまくればいいわけではないということが、
裏側の仕組みを踏まえた上で理解できたかなと思います。
インデックスを作りまくると、
それは実際インデックスのサイズも必要となってくるわけなので、
インデックスを作れば作るほど、
インデックス用のディスクサイズというのが必要になってきたりしますし、
あとはインデックス自体を更新しなきゃいけないですよね。
例えば辞書のアナロジーにまた戻りますけど、
例えば辞書を作りますと、インデックスを作ります。
辞書の世界もそうですけど、
第一版、第二版、第三版というふうに新しい単語が出てきたり、
もう使われなくなった単語を削除したりとか、
あとは新しい意味を加えたりアップデートしたりとか、
あとは若者が使う新しい言葉を入れたりクリエイトしたりとか、
というケースは出てくると思います。
そのために作品も更新しなくちゃいけないですよね。
データベースも同じなので、
本体に更新があるたびにインデックスも更新しなくちゃいけません。
つまりインデックスを作れば作るほど、
ライトのパフォーマンスというのもデグレデーション、
ライトのパフォーマンスにも影響していく可能性があります。
なのでリードのパフォーマンスを上げるためにインデックスを作る、
ただ一方でそれはインデックスのためによりサイズが必要となってきたりとか、
ライトへのパフォーマンスへの影響があるということも、
この章を読んで裏側の仕組みから理解できたんじゃないかなと思います。
ということで、今回は全然DBMSの裏側の仕組みに入る前に、
すごいハイレベルでDBMSが普段SQLを発行したら結果を返してくれるまで、
どのように裏側で頑張ってくれているのかであったりとか、
あとその世の中にいろんなプロダクトがありますよね、
MongoDBとかGoogle SpannerとかBigtableとかRedshiftみたいな、
それらを分類するときにローオリエンティッド、
列施工とか行施工とかあとワイダカラムナストレージとか、
いろんな見方があるよということを理解したり、
あとはインデックスというのも裏側の仕組みで見ると具体的にはどういうことなのかというのを、
この章を読んで理解できた方が多いんじゃないかなと思います。
今回初回だったということもあって、内容はハイレベルだったんですけど、
読書面も結構盛り上がりましたね。
個人的にも新しいキーワードとかいくつかテイクアウエーがありました。
個人的に気になったのは、
本書の中でも軽くキーワードとして触れられていたのかな。
最近の新しめの研究としては、
本書ではメモリベースとかディスクベースとかっていう話がありましたけれども、
NVM、Nonvolatile Memoryという、
起発しないメモリー上にDBMSを置いたらどうなるのかということで、
結構論文が出ていたりだとか、
他の本とかでも記載があったりするんですけれども、
そこについて調べてみたいなと思いました。
それについて触れてくださった参加者がいたんですけれども、
僕は現時点でNVMベースのDBMSについてあまり詳しくないので、
データベースの多様性
それは一つテイクアウエーかなと思いましたね。
参加者の方それぞれによって、
今使っているデータベースが全然違いますと、
僕は例えば会社ではMySQLを使っていたりとか、
ビッグテーブルを使っていたりしますけれども、
POSグレを使っている方もいれば、
AWSのDynamoDBみたいな、
ドキュメントベース思考のデータベースを使っている方もいますし、
あとは僕が全然聞いたことないようなデータベースを使っている方もいますし、
ストリーミングとかでいろんな形でDBMSを使っている方もいるので、
そのバックグラウンドがすごい多様なのはすごい良かったなと思います。
なので普段自分が使っているデータベースの経験を踏まえた上でのコメントとか疑問とか、
あとは他の人と比較・検討しながら、
他の人が使っているプロダクトとの違いというところに着目して、
より理解が含められたんじゃないかなと思います。
ここでつまずいたポイントで多かったのはそうですね。
データベース処理手法の理解
まずDBMSアーキテクチャのところは割と理解した方が多くて、
カラムアオリエンテッドデータベースのところの使いどころ、
これについてキーワードを始めて聞いた方とかは
具体的にどういった使いどころがあるのかなというところについても
ディスカッションポイントがあったりしましたね。
あとはやっぱりインデックスファイルが具体的には何物なのか、
検索を効率化するということは聞いていたけれども、
具体的にディスク上でどういうレイアウトになっているかというのを
ざっくりイメージできたのは第2章、第3章につながっていくかなと思います。
今回個人的にちょっとワクワクしているのはですね、
フロントエンジニアとかモバイルエンジニアの方も参加してくれていて、
モバイルでも例えば僕の理解が正しければSQライトの幅2みたいなのを
動かしていたりすると思うんですけど、
オンモバイルとか各デバイス上での最新のDBMSの事情であったりとか、
具体的に普段の開発でどのようなことを気をつけているのかとか、
あとはリモート側のデータベースの自動新規みたいな
ファイアベースとかも提供していたりしますけれども、
そこら辺の最近の状況についてキャッチアップできたりすると
いいかなと思っていたりしますね。
あとはOTLP、OLAP、あとはそれの派生としてHTAPというのがあって、
そこら辺のキーワードについて調べましたという方もいらっしゃいましたね。
LTPというのがオンライントランザクションプロセッシングデータベースかな。
OLAPというのがよりどっちかというと分析とかレポート作成に
強みを置いているオンラインアナリティカルプロセッシングデータベースですね。
HTAPというのがそれのハイブリッドという形で、
例えば具体的に言うとOTLPは業種項が多いですね。
MySQLとかPosgreですけれども、
OLAPだと例えばビッグクエリとか分析用のデータベース、
レッドシフトとかあったりしますけれども、
そこら辺について自分が知っているプロダクトがどっちなのかという観点で
考えてみた方も何かいらっしゃいました。
そんなところかな。
あとは、内容としてはそこまで突っ込んだものではなかったので、
本書の中でもイントロの章なので読みやすかった方も多かったんじゃないかなと思います。
B3の基本と目的
個人的には今回のデータベースインターナルズの参加者募集の収録というのも
過去に去年の末に公開したところでも
結構ブッククラブ自体の運営に対する方針とか工夫とか
自分の思いみたいについて語っていたので、
ちょっとそこについては全てはリピートしないんですけれども、
今回実際始まってみてやっぱり良かったなと思うのは、
第3回目と違って1つのタイムゾーンというか
1つのチームをタイムゾーン回してやっていくぞという風にしたので、
やっぱり前回と違って1つのチームでやってるぞみたいな感じで
すごい議論もDiscordも含めて盛り上がり始めているなというところもありますし、
やっぱり今までは他の参加者のゲストの収録とかを聞いて
名前も知ってたしDiscordでも絡んでたことはあったけど、
初めてミーティングで顔を合わせて嬉しかったですみたいな
フィードバックとかもらえたりしたので、
そういう意味で今回形を変えたのは良かったかなと思います。
何回か回数を重ねるにつれて課題とかも見えてくると思うんですけれども、
とりあえず第1回やってみて狙った効果は出たし、
良いフィードバックがもらえたかなと思います。
技術メモも相変わらず事前に質問があったりコメントがあったりして盛り上がっているので、
僕個人もスレッドで議論したりDiscordで貼ってくれた新しいリンクを見たりすることで
キャッチアップしたり記憶を新しくリフレッシュさせたりというところもあるので、
すごい自分として学んでいますね。
今回個人的にやってて良かったなと思うのは、
手元で再現環境を作りながらやってみるということですね。
例えば今回はデータファイル図とかインデックスファイルの話があって、
インデックスの仕組みとか動きについて結構詳しくやっていくと思うんですよね。
そこを深く理解するためには、
例えば自分が使っているデータベース、
例えばポスグレーだったらGitHubとかでオープンソースの実装を見てみるとか、
あとはGPTにリファレンス実装を書いてもらってそれを理解するというやり方もあると思いますし、
例えばインデックスでいうと手元にポスグレーを動かしたりとか、
あとはスーパーベースみたいなある程度フリーで使えるソフトウェアザーサースの
ポスグレーとかMySQLがクラウドで動いている環境を作っちゃって、
そこで適当なテーブルを作っていろんなインデックスを作って実行計画を見てみるとか、
そういったやり方をしながらハンズオンも適度に絡めながらやっていけるといいかなと思います。
第2章、第3章となっていくとB3の細かい動きになっていくんですけれども、
もしかしたらデータ構造アルゴリズムあたりを勉強したことがある方は、
その機構造についてベースの知識があるかもしれないんですけれども、
そうじゃない方とかは、例えばまずBSD、バイナリーサーチを
自分の好きなプログラミング言語で書いてみたりとか、
あとはリートコードスタイルでB3のノードスプリットとノードマージンについて書いてみるとか、
そういうやり方もありかなと思っています。
これもとっかかりは、GPTとかに聞くといい感じのクエスチョンを作ってくれるんですね。
例えば、プロンプトの例として、
データベースインターナル図を読んでいて、B3に理解したいですと、
インタビュースタイル形式でノードスプリットとノードマージンについての
クエスチョンを生成してくださいみたいな感じにすると、
程よいスコープのクエスチョンを生成してくれたりするので、それに合わせて、
プログラミング言語も指定すると簡単にユニットテストとかも合わせて書いてくれたりするので、
それに合わせてコードスクリプトを書いてみたりすると、
より深く理解できるんじゃないかなと思っています。
個人的には、この本を読みながら最新の情報もキャッチアップしたくて、
過去に読んだけどうまく読み切れてなかった、
例えばスパナの論文とか、これはちょっと古かったりしますけど、
2006、2007年くらいかな。
例えば論文を改めて読み返してみたりとか、
あとは先ほどもちょっと触れましたけれども、
ノンボラタイルメモリーベースのDBMSについて今はどういう状況なのかというのとか、
その外部の論文、この本書に載せられていないようなアップデートのされた情報とかも見ながら、
Book Clubの内容にコントリビューションできたらいいかなと思っています。
ということで、第1章の振り返りを簡単にしました。
第2章はB3ベーシックということで、
そもそもB3って何よ、みたいなところをやっていきます。
第2章の目的は、ローベースがDBMSではB3を使うことが多いです。
Postgreでも使っているしMySQLでも使っているんですけれども、
なぜディスクベースのDBMSでB3が好まれるのかを理解するというのが1つのゴールかなと思っているので、
これから2章を読む方はぜひ、
なぜB3がディスクベースのDBMSで使えるのかを説明できるようになると1つ目標達成かなと思うので、
ぜひその観点を頭に入れて読んでみてください。
ということで、今回はLondon Tech Talk Book Club第4弾、
データベースインターナルズ第1章の振り返りでした。
ありがとうございました。
23:03

コメント

スクロール