こんにちは!クラウドの世界へようこそ。
今日は、世界中の巨大なシステムを裏から支えている怪物級のデータベース「Cloud Spanner(クラウド スパナー)」について、その頭脳である「クエリオプティマイザ(最適化エンジン)」の秘密を一緒に紐解いていきましょう。
「データベースの最適化」とか「実行計画の制御」なんて聞くと、なんだか難しそう、冷徹なロボットが裏でパパッとやっている感じがしますよね。でも、大丈夫。ここをクリアすれば、あなたもCloud Spannerの動きを手の内に入れることができますよ。
それでは、優しく、そして本質的な世界へご案内します。
—
1. クエリオプティマイザって、例えるならどんな存在?
まず、「クエリオプティマイザ」が何をやっているのか、日常の例えでお話ししますね。
想像してください。あなたが仲間と一緒に、東京ドームの巨大な敷地内にある「1冊の特定のメモ帳」を探し出すミッションを任されたとします。
やり方は無限にありますよね。
- 「全員で手分けして、すべての椅子を片っ端から調べる?」
- 「インフォメーションセンターに行って、メモ帳を預かったスタッフをピンポイントで呼び出す?」
この「どうやって最短で、最も効率よく目的のデータにたどり着くか」を考える作戦参謀こそが、Cloud Spannerにおける「クエリオプティマイザ」です。
Spannerはデータを世界中に分散して保存しているため、この作戦参謀の頭の良し悪しで、検索スピードが何百倍も変わってくるんです。
—
2. 時には参謀の作戦を「上司の権限」で変えてみる:オプティマイザのバージョン
通常、この作戦参謀は優秀なので、時代(アップデート)とともにどんどん賢くなっています。Spannerでは、この参謀の「頭脳のバージョン」を自分で選ぶことができます。
例えば、「最新のバージョン(バージョン600など)に上げたら、なぜかいつもと違うルートで探し始めて少し遅くなった気がする……」なんてことが、ごく稀に起きる世界です。そんなときは、タイムマシンに乗るように、「しばらく前の、あの時一番調子が良かった作戦参謀のバージョンに戻そう」ということが簡単にできます。
これを設定するのが、オプティマイザのバージョン管理です。
— セッションごとに、少し前の賢い頭脳(バージョン)を指定する例
SET OPTIMIZER_VERSION = ‘550’;
「最近のアップデートで動きが変わっちゃったな」という時に、過去のバージョンに固定してシステムの安定を守る。これがプロの現場で使われるテクニックです。
—
3. 「いや、こっちのルートで行け!」と指示するヒント句
さて、ここからが本番です。
基本的には作戦参謀におまかせで大丈夫なのですが、データベースのデータ量が爆発的に増えてくると、参謀がちょっとした「勘違い」をすることがあります。
「いやいや、参謀くん。君は『みんなで手分けして探す』と言っているけれど、このデータとあのデータを組み合わせるなら、絶対に『あそこの受付を先に通るルート(結合順序)』の方が早いはずだ!」
そう人間側(エンジニア)が確信している時、作戦計画を無理やり書き換えさせる魔法の呪文があります。それがヒント句(FORCE_JOIN_ORDERなど)です。
実際の書き方を見てみよう
例えば、お客様のデータ(Customers)と、そのお買い物の履歴(Orders)を合体させて探すとき、次のようなSQLを書きます。
— @{FORCE_JOIN_ORDER=true} というのが、参謀への「俺の言う通りに動け!」というヒント句です
@{FORCE_JOIN_ORDER=true}
SELECT
c.CustomerName,
o.OrderDate
FROM
Customers c
JOIN
Orders o ON c.CustomerId = o.CustomerId
WHERE
c.Country = ‘Japan’;
この呪文(`@{FORCE_JOIN_ORDER=true}`)を添えることで、Spannerの参謀は「おっ、今回は人間側から順番の指定があるな。じゃあその通りに、まずCustomersを片付けてからOrdersを結合しよう!」と、あなたの指示通りに動いてくれるようになります。
—
4. いつ、この「強制制御」を使うべき?
「じゃあ、全部のSQLにこのヒント句を書いておけば完璧じゃん!」と思ったあなた、鋭いですが、それはちょっと待った!です。
日常の仕事でもそうですよね。上司が部下の仕事に毎回「こうやれ、ああやれ」と口出ししていたら、部下は自分で考えるのをやめてしまいますし、環境が変わったときに対応できなくなってしまいます。
クエリオプティマイザの制御は、あくまで「最終兵器」です。
1. 基本はオプティマイザ(参謀)に任せる(99%はこれでうまくいきます)
2. データが巨大になりすぎて、どうしても特定のクエリだけが遅くなった時だけ、ピンポイントでヒント句を使ってテコ入れする
このスタンスを守るのが、Cloud Spannerをスマートに乗りこなす秘訣です。
—
さいごに
お疲れ様でした!
今日は、Cloud Spannerの頭脳である「クエリオプティマイザのバージョン管理」と、思い通りに動かす「ヒント句(FORCE_JOIN_ORDER)」についてお話ししました。
- オプティマイザ = 最短ルートを考えてくれる優秀な作戦参謀
- バージョン管理 = 参謀の頭脳の時代を選んで安定性を保つ技
- ヒント句 = 「ここだけは俺の言う通りにしろ!」とルートを強制する最終手段
ここをクリアできれば、あなたはもうCloud Spannerの仕組みの核心に触れています。巨大なデータがうごめく海原でも、もう迷うことはありませんよ。
次回の冒険でも、一緒に楽しくエンジニアリングの極意を学んでいきましょう!
コメント