午後の部:SQLの効率的な書き方
データベースの性能問題を解決するために「実行計画」を知り、それを用いてどのようにクエリを改善できるのか、を考えていく必要があります。実行計画とは、RDBMSが与えられたクエリをどのように実行するか立てる計画で、通常複数の計画が立てられるものです。そのうち、RDBMS側がオプティマイザでどの実行計画がよいかを決定するのですが、RDBMSによってはオプティマイザにヒントを与えて、どの実行計画を利用するかを調整できる場合もあります。
まずは実行計画をどのように見るか、というところがファーストステップとなります。
実行計画とその見方
Oracle DBについて、SQL*Plusから以下のように設定すると、実行計画と共に実際にSQLを実行し、それにかかった時間が測定できます。
set autot traceonly set timing on set time on
本番環境では気軽に重いクエリの実行はできないので、set autot traceonlyの後にexpをつけて、SQLを実行しない(いわゆるdry run)も可能です。しかし、ここでは一人一台の実行環境がありますし、すでに実行計画表示用のデータをもったテーブルもありますので、気にせず行いましょう。そして実行計画の見方とかかる時間を確認したら、結合(Join)について、実際にどのように改善できるかどうかトライしてみます。
結合のアルゴリズムと実行計画
結合(Join)には主な結合アルゴリズムとしてNL(NESTED LOOP)、HASH、SORT MERGEがありますが、今回はNLとHASHについて、その結合アルゴリズム自体の説明と、そのアルゴリズムだからこそ「こうすればはやくなる・遅くなる」の説明が演習とともに示されます。ここでも実際にデータが用意されている、ということが役立ち、例えば前提条件をこう変えると、どのアルゴリズムが利用され、どちらがはやいか、というのを、単なる机上の問いと説明、答えに終わらず、実際に実行して確認や答え合わせができる、というのが、達成感があってよかったです。
最後に
ミックさんの初心者向けの書籍は、本だけでも非常に分かりやすく役立つものですが、やはり本人と対面で、実際のデータ操作をしながら勉強し、不明点を本人に確認できる場、というのは(受講料がやや高価ですが)なにものにも替えがたい経験でした。
私の場合、本を読んだときにはCASE式には納得がいっていましたが、Window関数については「へぇ~」って感じで読み飛ばしていたものが、今回の受講でかなり納得して、これが使える商用版の新しめのバージョンや、PostgreSQLなどでは積極的に使ってみようという気になりました(注2)。
また、便利な手段(CASE式やWindow関数)が無かった時代にはどのような(効率の悪い)クエリで処理を行っていたか、ということも、演習の箸休め的にコラムで触れられていたのも、面白かったです。
SQLの上っ面だけではなく、その仕組みも理解して、一皮むけたDBエンジニアへの足がかりに、本講座を受講してみてはいかがでしょうか?
注2
PostgreSQL以外のオープンソースRDBMSでも、Firebirdの最新バージョン3.0や、MySQLからフォークしたMariaDBの次期バージョン10.2からはWindow関数が使えるようになっています。
次回開催(2016/8/30)のお知らせ
次回は、『達人に学ぶ ビッグデータ時代の最新SQLテクニック講座』と題したセミナーを8月30日(火)に開催します。SQLのテクニック紹介をさらに充実し、大規模データの高速処理に役立つノウハウを紹介します。ご期待ください!