【入門編】 クエリ最適化コストモデル – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
今日は、Spannerの頭脳とも言える「クエリオプティマイザ(最適化エンジン)」の秘密についてお話しします。

「データベースの裏側の難しい仕組みなんて、自分にはまだ早いよ…」なんて思っていませんか?
大丈夫。ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!

今回は専門用語をできるだけ使わず、私たちの日常の出来事に置き換えて、その本質を優しく紐解いていきましょう。

—

1. Spannerの頭脳:オプティマイザってなに?

突然ですが、あなたは今、日本全国に散らばる1,000人のお友達全員に「今夜の夕飯のメニュー」を聞いて、一番人気のメニューを調べたいとします。

やり方は色々ありますよね。

  • A:1人ずつ電話をかけて聞いて回る(時間がかかる!)
  • B:SNSのグループチャットで一斉にアンケートをとる(一瞬で終わる!)

データベースの世界でも全く同じことが起きています。私たちが「このデータが欲しい!」と命令(クエリ)したとき、Cloud Spannerの中にある「オプティマイザ」という名の超優秀な司令塔が、「どうやってデータを集めるのが一番速くて、一番ラク(コストが低い)か?」の作戦計画書(実行プラン)を考えるのです。

—

2. 作戦計画の裏側:どうやって「コスト」を計算しているの?

司令塔であるオプティマイザは、やみくもに作戦を立てているわけではありません。彼らは以下の2つの材料を組み合わせて、コスト(労力)を計算しています。

① 統計情報(メモ帳の記録)

「このテーブルには今、何行のデータが入っているか」「名前のデータはどれくらいバラエティがあるか」といった、データの健康診断データをオプティマイザは常にメモしています。
日常に例えるなら、「スーパーの特売日の混雑具合を記したメモ帳」です。「あそこのレジは今並んでるから、裏口のレジを使おう」と判断できるのは、このメモのおかげです。

② 分散実行コスト(お使いの交通費と人件費)

Cloud Spannerの最大の特徴は、世界中にデータがバラバラに散らばっている(分散している)ことです。
データを集めるときに、遠くのサーバー(例えばアメリカのサーバー)からデータを取ろうとすると、通信に時間がかかりますよね。データベースの世界では、この「ネットワークを跨ぐ通信」や「ディスクを読む量」がそのまま「コスト(高額な交通費)」になります。

オプティマイザは、「なるべく通信を減らして、手元のサーバーだけでデータを片付けられないか?」を必死に計算しているのです。

—

3. 実践!Spannerの作戦計画をのぞいてみよう

百聞は一見にしかず。Spannerが実際にどんな作戦を立てているか、簡単なSQL(データベースへの命令文)を例に見てみましょう。

— ユーザーテーブルから、東京に住んでいるアクティブなユーザーを探すクエリ
SELECT user_id, user_name
FROM users
WHERE city = ‘Tokyo’ AND status = ‘active’;

この命令を投げたとき、Spannerの司令塔は次のような作戦(実行プラン)を組み立てます。

[実行プランのイメージ]
Distributed Union (全体をまとめるよ)
└── Scan: users (インデックス「idx_city」を使って、東京の人だけをピンポイントで狙い撃ち!)

ここがポイント!
もし「東京に住んでいる人」の目印(インデックス)が用意されていなかったら、司令塔は「全ユーザー100万人分のリストを上から順に全員分めくる」という、途方もなくコストが高い作戦(フルテーブルスキャン)を選ばざるを得なくなります。
だからこそ、「どこに目印をつけるか」が、Spannerを爆速で動かすための最大のコツになるのです。

—

4. まとめ:私たちがエンジニアとしてできること

Cloud Spannerのクエリオプティマイザは、世界最高峰の頭脳を持っています。基本的には、私たちが何も言わなくても一番安上がりで速い方法を勝手に見つけてくれます。

でも、そんな優秀な司令塔でも、「データの地図(インデックス)」を与えてあげないと、最高のパフォーマンスを発揮できません。「どこにどんなデータがあるか」を私たちが適切に整えてあげること。それが、Spannerと良いチームワークを築く秘訣です。

どうでしょう? Cloud Spannerの分散実行の仕組みとコストの考え方、少しイメージが湧いてきたのではないでしょうか。

この基本マインドさえあれば、どんなに大きなシステムを任されても怖くありません。一緒に一歩ずつ、エンジニアとしての高みを目指していきましょう!

コメント

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