分12はじめに結果として,SQLのような関係型の言語は非手続き型の言語と呼ばれるが,これはユーザは「いかに」ではなく「何を」を指定する―つまり,獲得するための手続きを指定することなしにユーザは何が欲しいかをいう―からである。Date(注1)Webの入力フォームであれ,コマンドラインツールであれ,インタフェースにかかわらず,リレーショナルデータベースに対する操作はSQLという専用の言語で行われます。ユーザ(プログラマ含む)が意識的にコーディングするのは通常このSQLレベルまでで,あとはDBMSが処理を終え,結果を返却するのを待つのみです。SQLとRDBMSにおいては,ユーザはデータのありかを知る必要もなければ,そこへのアクセス方法も考えません。いう仕事は,全部DBMSに任せています。このプロセスは,通常「プログラミング」と呼ばれるものとはかなり異なります。普通,データの検索や更新をプログラミング言語によって行う場合,どこにあるデータをどのように探すか,ということを細部に渡って記述しなければなりません。注1)第4回(3)の参考文献[1]p.68より引用。手続き型と非手続き型の違いこの態度の違いは,良いとか悪いというものではなく,ソフトウェアの設計思想の違いです。C言語,JavaからRubyに至るまで,手続き型を基礎とする言語とシステムにおいては,ユーザがデータアクセスのための手段(How)を責任持って記述することが前提です。他方,非手続き型であるリレーショナルデータベースはその仕事をユーザからシステム側に移管しました。その結果,ユーザのすることは対象(What)の記述だけに限定されたのです。権限委譲の功罪リレーショナルデータベースが,このような大胆な権限委譲を断行したことには,もちろん正当な理由があります。「⁠そのほうがビジネス全体の生産性は上がるから」です。現在の状況を眺めると,この言葉は半面正しく,半面間違っていました。正しかったことは,RDBMSがシステムの世界の隅々にまで浸透したことからわかります。間違っていることは,それでもやっぱり私たちはRDBMSを扱うのに苦労しているからです。SQLは思ったほど簡単な言語じゃなかったし,パフォーマンスが悪いこともよくあります。本稿では,こうしたRDBMSが抱える諸刃の剣とも言うべきパフォーマンスの部分について,いつもどおりDBMSの内部動作を明らかにしながら,その対処方法を探っていきます。対象環境すべてのリレーショナルデータベースデータへのアクセス方法はこうやって決まるRDBMSにおいて,データアクセスの手続きを決めるモジュールがクエリ評価エンジンです。これは,ユーザから送信されたSQL文を最初に受け取るモジュールでもあります(注2⁠)⁠。クエリ評価エンジンは,さらに複数のサブモジュールから構成されています。注2)DBMSのアーキテクチャの全体像については,本連載第1回を参照してください。クエリが処理される流れここでクエリがどのように処理されて,実際にデータアクセスが実行されるのかをおおまかに図示すると,図1のようになります。Education,2002年,p.405)パーサ1パーサ(parser)の役割は,名前のとおり構文解析です。受け取ったSQL文(クエリ)を一度バラバラの要素に分解し,それをDBMSが処理しやすい形式に変換することです。この処理が最初に必要かといえば,第一に,受け取ったSQL文が常に構文的に適正である保証がないため,整合性チェックが必要だからです。ユーザがカンマを書き忘れたり,FROM句に存在しないテーブル名を書いたりしてきたときには,「⁠書類審査」で落第させる必要があります。第二の理由は,SQL文を定型的な形式に変換することで,DBMS内部での後続の処理が効率化されるからです。構文解析は,SQLに限らず一般のプログラミング言語のコンパイル時にも同様に実行されるものです。オプティマイザ書類審査をパスしたクエリは,次にオプティマイザ(optimizer)に送られます。オプティマイズの和訳に最適化という語が当てられているとおり,ここで「最適」なデータアクセスの方法(実行計画)が決定されます。この処理がDBMSの頭脳におけるコアです。オプティマイザは,複数のアクセス経路,インデックスの有無,データの分散や偏りの度合い,DBMSの内部パラメータなどの条件を考慮して,選択可能な多くの実行計画を作成し(2プラン生成⁠)⁠,それらのコストを計算して(3コスト評価⁠)⁠,最も低コストな一つに絞り込みます。カタログマネージャそのとき,重要な情報を提供するのが4カタログマネージャです。カタログとはDBMSの内部情報を集めたテーブル群で,テーブルやインデックスの統計情報が格納されています。そのため,このカタログの情報を単に「統計情報」とも呼びます。本稿でもこの呼び名を使います。RDBMSがデータアクセスの手続き決定を自動化している理由は,候補の数が多いうえに,それら個々のプランについてしらみつぶしにコスト計算をして,互いを比較考慮しなければならないためです。このような計算はコンピュータにより高速に処理可能ですので,オプティマイザに任せたほうが得です。プラン評価オプティマイザが1つの実行計画に絞り込んだら,それを受け取って実行するのが,5プラン評価の処理です。実行計画というのは,あとで実際にいくつかのサンプルを見ていきますが,まだそのままDBMSが実行できるようなコードにはなっていません。人間が目で読むことができる,本当の「計画書」です。そのため,これを評価して手続き型のコードへと変換することが必要です。クエリ評価エンジン著者プロフィールミックSI企業に勤務するDBエンジニア。データウェアハウス業務に従事している。自身のサイト「リレーショナル・データベースの世界」でデータベースとSQLについての技術情報を公開している。Press』で「SQLアタマアカデミー」を連載中。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。