廣瀬製紙株式会社

Employees' Blog

SQLを動かすのは統計の力
DBMSのクエリオプティマイザに感動した話

公開日:2025.01.29 更新日:2025.01.29
データベースと開発者たちのイラスト

DBMSとクエリオプティマイザ

こんにちは。廣瀬製紙株式会社 稼働率向上PJチームのA.Mです。
システム構築においてデータベースは必須の要素ですが、あらためてデータベースについて学び直す中でDBMS(データベース管理システム)の優れた仕組みに感嘆させられています。

リレーショナルデータベースを使う際に、私たち開発者はなにげなく(そうじゃない人もいると思うけど)SQL文を書いています。しかし、SQL文に基づいてデータベースがどのように探索を行い、目的の処理を実行するのか。また、どのような最適化で計算量を削減できるのか。これらを厳密に考える機会は少ないのではないでしょうか。
もちろん、特定のカラムにインデックスを貼ったりなどそのくらいのことは考えますが、たとえば計算の仕方によってそれが線形的な計算になるのか、それとも対数的な計算がされるのかといったことまで意識する機会はないのではないでしょうか。
(計算量に関してはこちらの記事が大変勉強になります)

DBMS自身がSQL文を解析し、クエリオプティマイザが統計情報をもとに最適な実行計画を策定するからこそ開発者がそれを意識しなくても、高速にデータを管理できると言えることでしょう。

データベース最適化と開発者

私の前職はWeb系の開発企業でブラウザ上で動作するとあるアプリを開発していました。

大量にデータを処理することがあるとすれば、それはほぼすべてデータベースの読み書きくらいなもので、サーバーサイドのプログラムで直に多量のデータを処理するといった機会はほぼありませんでした。 ゆえに計算量について厳密に意識することも、いかに計算量を減らすかといった最適化のためアルゴリズムを考えるといったこともされていなかったと思います。そしてそれを開発者が意識しなくても効率のよいデータ探索がなされるということこそがDBMSの優れたところでもあり、一方で知らなくてもできてしまうため理解が深まらないままになってしまう理由でもあります。

とはいえシステムの規模が大きくなってくると、些細な無駄な計算が積もり積もって”もっさり”アプリの誕生という結果を招いてしまうため、正しく計算量について学んでおくことは大事だし、それを理解するために高校数学の基礎の基礎をきちんと身に着けておくことも大事だなぁと感じています。そういう意味で競技プログラミングは入口としてたいへんいいものだと思っています。
(ただし私は競プロ下手くそです💧 AtCoderムズスギィ!)

クエリオプティマイザ

データベースの学習を進める中で、DBMSの賢さに改めて感動しました。それは、クエリオプティマイザが実行計画を立てる際に統計データを活用しているという点です。

2022年度以降、高校数学の学習指導要領に統計学習が追加されました。
そこでは母集団と標本という概念が出てきます。全体を知るために、ランダムにサンプリングしたデータを使うという考え方です。
例えば、日本人の平均身長を知りたい場合、全員を調べるのではなく、統計的に意味のある一定数の人々を調査することで、おおよその結果を導き出すことができる、という考え方ですね。

DBMSのクエリオプティマイザも同じような考え方で動いており、私がクエリを実行すると、オプティマイザはデータベースを解析した統計データをもとに、「どのような方法で処理を実行すれば効率が良いか」を自分で判断します。
もし大量のデータがあるテーブルで、すべてのレコードを一つ一つ確認して最適な実行方法を決めようとすれば、それだけで膨大な時間がかかってしまいます。
そのため、統計的に有意であるとみなされる範囲の解析を事前に記録しておき、そこから得られた情報を基に実行計画を立てているのです。
人間が統計的な調査を行うのと同じようなことをしているのですね。母集団全体を調べることなく、標本から得られた情報を使って合理的な判断を下す(少なくともそうしようとしている)わけです。

このような賢い仕組みのおかげで、私たちは大量のデータを扱う場合でも、比較的スムーズにデータベース操作を行うことができているのです。
与えられた情報から最適な方法を導き出すDBMSの最適化技術は、まさに人間の思考のようであり、そこにデータベース技術の奥深さを感じます。

DBMSってほんと賢い・・・