【入門編】 クエリプランキャッシュ – Cloud Spanner

こんにちは!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と対話するときの基本は完璧です。実務でコードを書くときは、ぜひ「パラメータ化クエリ」を意識してみてくださいね。

ここをクリアしたあなたなら、どんなに大きなシステムでも自信を持って任せられます。
さあ、明日からの開発も、この知見を胸に楽しくコードを書いていきましょう!

コメント

タイトルとURLをコピーしました