Honmushi blog
【実践技術書】達人に学ぶSQL徹底指南書2019/02/19

【実践技術書】達人に学ぶSQL徹底指南書

SQLをより使いこなして上級者になるための本です。

SQLをの基礎的なことはわかっている人向けの内容で、応用的な書き方がメインになっています。といっても「CASE」とか「HAVING」といった位のものです。初心者から次のステップにいくために必要といったくらいでしょうか。

各章には練習問題もついています。SQLをどうやって勉強したら良いかわからないと悩んでいる人にもおすすめです。

ざっくり紹介

応用的な位置づけになっています。「CASE」や「HAVING」、結合などを取り扱います。初心者の次のステップというくらいかなと思います。 大規模なRDBを普段から取り扱っている人にとっては、特に難しい内容ではありません。簡単なものしか取り扱ったことがなければ、とても参考になると思います。

SQLを書く際の作法なども紹介されています。スペースやインデント、大文字小文字の使い分けなど覚えて置くべきです。現場によってルールはあると思いますが、基本的なルールが書いてあるので参考になります。

他にもRDBの歴史や背景についての紹介もあります。仕組みや裏側についての情報もあるので、知らない方は読んでおくと世界が広がっていいと思います。特に実務では訳には立たないと思いますが、概念を知っておくと理解が深まります。

SQLのチューニングについて基本的なことが書かれているので参考になります。ただし、簡単に取り入れられるものばかりで大きな改善は見込めないかもしれません。SQLの書き方に関するものなので、普段から気をつけておくのがいいと思います。

例えば以下のようなものがありました。そのまますべての環境で該当するわけではないですが、普段SQLを書く際には気をつけようと思います。大きな考え方としては、中間テーブルやソートを減らすこと、インデックスを利用することによって、物理メモリへのアクセスを減らすことを目指します。

サブクエリを引数に取るときはINよりもEXISTSを使うべき

EXISTSならインデックスが有効になる。EXISTSは該当があればそこで検索を打ち切る。 INの場合はサブクエリの実行結果をワークテーブルに格納して、そこから全件走査を行います。そのため負荷が大きいです。

サブクエリを引数に取るときはINよりも結合を使うべき

サブクエリがないので中間テーブルが作られない。インデックスが利用できる

集合演算子のALLを使う

UNIONとかは暗黙的にソートが行われます。重複排除を行うためです。ソートは負荷が大きいです。 重複を気にしない、重複が起きないことが事前にわかっているのであればUNION ALLを使いましょう。

DISTINCTをEXISTSで代用する

DISTINCTも重複削除のためにソートが行われます。 EXISTSを使うことでソートせずに重複削除を行うことができる場合があります。

極値関数でインデックスを使う

MAXとMINです。ソートが行われますが、インデックスがあればインデックスのスキャンだけですみます。できるのであればインデックスを対象にスべきです。

WHERE句で書ける条件はHAVING句には書かない

GROUPで集約する後にHAVINGでフィルタリングするか、集約する前にWHEREでフィルタリングするかです。 GROUP BY による集約時にソートが行われるので、先に行数を絞ったほうがよいです。WHERE句ならインデックスが利用できるかもしれません。

GROUP BYとORDER BY で指定するキーでインデックスを使う

GROUP BY とORDER BYで指定するキーはインデックスの存在するキーであれば、インデックスを利用できます。ソートが行われるので、ソートの高速化が期待できます。

索引時に加工しているとインデックスが無効

インデックスを利用するときは、条件式の左辺は裸。

WHERE column * 1.1 > 10ではなく
WHERE column > 10 / 1.1にする

IS NULLをつかった場合はインデックスが無効

インデックスにはNULLは存在しないためです。

非定型をつかっているとインデックスが無効

<>とか!=とかはインデックスが無効です。

ORをつかっているとインデックスが無効

複合インデックスがあるのに列の順番が違う

そのままです。複合インデックスは正しく設計して、正しく利用しましょう。

後方一致、または中間一致のLIKEを用いているとインデックスが無効

前方一致のみ有効です。

暗黙の型変換を行っているとインデックスが無効

オーバーヘッドも発生しますし、良くないことばかりです。正しくDBを定義を確認して明示的に方を変換して扱うようにしましょう。

HAVINGで中間テーブルを減らす

中間テーブルをつかってWHERE句に指定しがちですが、中間テーブル無しでHAVINGでできるのであればそのほうが良い。

INで複数のキーを利用する場合、一箇所にまとめる

キーを結合したり行比較を用いることで、複数のINを一つにまとめられるかもしれません。

ビューで集約関数や集合演算が入っていると速度低下の原因になりがち

集約関数、AVG,SUM,COUNT,MAX,MIN

集合演算子、UNION,INTERSECT,EXCEPT

おわりに

初級者から一歩前に出るための知識が書かれています。練習問題もあるので、しっかり取り組んでおくと実務でも使えて良いです。実際にはデータ合ってのSQLなので、これだけでは役に立たないのですが、基本はとても大切です。

仕様に沿ったSQLを書き、正しくデータを取り扱えるようになるためには経験が重要かなと思います。初心者のうちは仕様書や定義をしっかり参照できるようになることが一番大切だと思います。

  • このエントリーをはてなブックマークに追加