こんにちは!Cloud Spannerの世界へようこそ。
チーフアーキテクトの私です。
「世界中の銀行口座のデータを同時に正確に処理したい」「何億人ものユーザーが使うゲームで、絶対にデータが消えたり遅くなったりしないようにしたい」。そんな夢みたいな願いを叶えてくれるのが、Googleが誇る最強のデータベース「Cloud Spanner(クラウド スパナー)」です。
今回は、Cloud Spannerが裏側で行っている超重要なお仕事の一つ、「クエリプランキャッシュ」についてお話しします。
「なんだか難しそうな名前だな……」と思いましたか?
大丈夫!今日ここでその仕組みをスッキリ理解してしまえば、あなたもCloud Spannerの基本をバッチリマスターしたと言えますよ。さあ、一緒に扉を開けていきましょう!
—
1. 例え話でウォームアップ:街の「超人気レストラン」の秘密
想像してみてください。あなたは、世界一美味しいと評判のイタリアンレストランのシェフです。
ある日、お店にたくさんのお客さんがやってきて、次々とこう注文しました。
- 「トマトパスタを1つ!」
- 「トマトパスタを大盛りで1つ!」
- 「トマトパスタをチーズ抜きで1つ!」
もし、お客さんが注文するたびに、あなたが「ええと、まずはトマトを洗って、お湯を沸かして、麺を茹でる時間は……」と、ゼロからレシピの段取り(計画)を考えていたらどうなるでしょう?
キッチンは大パニック。お客さんはお腹をペコペコにしたまま、何時間も待たされることになります。
そこで、優秀なシェフであるあなたは気づきます。
「待てよ、みんな『トマトパスタ』が食べたいんだ。だったら、一番効率よく作れる『調理手順の設計図(レシピ)』をあらかじめ紙に書いてホワイトボードに貼っておけばいいじゃないか!」
この設計図があれば、2人目以降のお客さんからは、設計図をパッと見るだけで、すぐに調理に取り掛かれますよね。料理が出てくるスピードは劇的に早くなります。
……実は、これと全く同じことが、Cloud Spannerの頭の中でも起きています。これが「クエリプランキャッシュ」の正体です。
—
2. Cloud Spannerにとっての「クエリプラン」とは?
Cloud Spannerに「このデータを探して!」とお願い(これをクエリと呼びます)を投げたとき、データベースはすぐにはデータを探しに行きません。
まず最初に、「どの順番で、どの引き出しを開けて、どうやってデータを集めるのが一番早いか?」という作戦会議を開きます。この作戦計画書のことを、専門用語で「クエリプラン(Query Plan)」と呼びます。
この作戦計画を作る作業(コンパイルと言います)には、実はちょっとだけ頭を使います(=計算コストがかかります)。
毎回同じような質問をされるたびに、この作戦計画をゼロから考えていたら、データベースの頭が疲れ果ててしまいますよね。
そこでCloud Spannerは、一度作った優秀な作戦計画を、一時的な記憶場所(キャッシュ)にメモしておくのです。これが「クエリプランキャッシュ」です。
—
3. なぜ「パラメータ化クエリ」がそんなに大切なのか?
ここで、エンジニアとして絶対に知っておくべき「超重要テクニック」をお伝えします。
先ほどのレストランの例に戻りましょう。お客さんがこう注文してきたとします。
1. 「IDが『101』のユーザーのデータをちょうだい」
2. 「IDが『102』のユーザーのデータをちょうだい」
3. 「IDが『103』のユーザーのデータをちょうだい」
人間から見れば、これは「IDの数字が違うだけで、やりたいことは同じ」だと分かります。しかし、コンピュータはとても真面目(で、ちょっと融通が利かない)です。
もし、あなたが次のような命令を直接送ったらどうなるでしょうか?
— よくない例:数字を直接書き込んじゃう場合
SELECT FROM Users WHERE id = 101;
SELECT FROM Users WHERE id = 102;
SELECT FROM Users WHERE id = 103;
データベース側から見ると、これは「文字の並びが毎回違うから、全部まったく新しい質問だ!」と判断されてしまいます。その結果、せっかくの作戦計画のメモ(キャッシュ)が使えず、毎回わざわざゼロから作戦を考え直すことになってしまいます。これは実にもったいない!
そこで登場するのが、「パラメータ化クエリ」です。こう書きます。
— 素晴らしい例:変わる部分を「変数(パラメータ)」にする
SELECT FROM Users WHERE id = @userId;
(※ `@userId` の部分に、あとから `101` や `102` という具体的な数字を当てはめます)
これなら、データベース側から見ると「あ、質問のカタチはさっきと同じだな! メモしておいた作戦計画がそのまま使えるぞ!」となります。
結果として、データベースの頭脳を休ませることができ、システム全体がもの凄く速く、安定して動くようになるのです。
—
4. 作戦計画の「お片付け(無効化条件)」
「じゃあ、一度作った作戦計画は、ずっと使い回していいんだね?」と思ったそこのあなた、鋭いですね!
世の中は常に変化します。例えば、レストランの厨房のレイアウトがガラリと変わったり、新しい調理器具が入ったりしたら、古いレシピのままでは逆に遅くなってしまいますよね。
Cloud Spannerも同じです。次のようなことが起きたとき、Cloud Spannerは「いままでの作戦計画は古くなったな」と判断して、キャッシュ(メモ)を綺麗さっぱり消去(無効化)します。
- テーブルの構造が変わったとき(新しい列が追加された、など)
- データがものすごく増えたり減ったりして、効率的な道順が変わったとき
- データの「統計情報」が新しく更新されたとき
データベースは、常に今の状態に一番ぴったりの作戦計画を使えるように、裏側で賢くお片付けをしてくれているのです。
—
まとめ:ここをクリアすれば基本はバッチリ!
いかがでしたか? Cloud Spannerの「クエリプランキャッシュ」の仕組み、イメージできましたでしょうか。
- クエリプラン = データベースがデータを探し出すための「作戦計画(レシピ)」
- クエリプランキャッシュ = その作戦計画を覚えておく「メモ帳」
- パラメータ化クエリ = メモを何度も使い回すための「魔法の書き方」
この3つのポイントさえ押さえておけば、Cloud Spannerと対話するときの基本は完璧です。実務でコードを書くときは、ぜひ「パラメータ化クエリ」を意識してみてくださいね。
ここをクリアしたあなたなら、どんなに大きなシステムでも自信を持って任せられます。
さあ、明日からの開発も、この知見を胸に楽しくコードを書いていきましょう!
コメント