【入門編】 クエリオプティマイザの制御 – Cloud Spanner

こんにちは!クラウドの世界へようこそ。
今日は、世界中の巨大なシステムを裏から支えている怪物級のデータベース「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の仕組みの核心に触れています。巨大なデータがうごめく海原でも、もう迷うことはありませんよ。

次回の冒険でも、一緒に楽しくエンジニアリングの極意を学んでいきましょう!

コメント

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