skillup

技術ブログ

Database

SQLのチューニングに関して

投稿日:2016年12月5日 更新日:

ここ2か月ぐらいはSQLの本でがりがり勉強してきましたね。当然復習も必要かと思いますが、だいぶいろんなことを覚えたなあという気がします。

一番勉強になった本はもちろん「達人に学ぶ SQL徹底指南書」とこのサイト「http://mickindex.sakura.ne.jp/database/db_support_sinan.html」です。

かなり高度なことを書いていると思いますが、平易な例題やなんといってもサイトに練習用のSQLがしっかり乗っているため非常に勉強しやすいです。

内容的にはおそらく3割ぐらいしかやっていないでしょう。まだまだ入り口に立ったばかりかと思いますが、これをベースにいろいろなSQLを書いていきたいと思います。

ちょっとほかにも勉強しないといけないこともあるので一旦SQLはおいておこうと思います。

さて、最後の本日はSQLのチューニングについてです。

こちら箇条書きにていろいろ書いてみたいと思います。

サブクエリを引数にとる場合INよりもEXISTSをとる。INよりも結合をとる

  • 結合キーにインデックスが張られていれば、テーブルの実表は見に行かず、インデックスを参照するのみで済む
  • EXISTSは一行でも条件に合致する行を見つけたらそこで検索をうちきるので、INのように全表検索の必要がない。NOT EXISTSも同様

ソートの回避

  • ALLオプションをうまく使う
  • DISTINCTをEXISTSで代用
  • MAX/MINでインデックスを使う
  • WHERE句で書けるものはHAVINGに書かない
  • GROUP BY ORDER BYでインデックスを使う

インデックスが有効活用されないとき

  • 索引列に加工を行う(計算式など)
  • IS NULLを使用
  • 否定形の使用
  • ORの使用
  • 後方一致、中間一致のLIKE述語
  • 暗黙の型変換

中間テーブルを減らせ

  • HAVING句の活用
  • IN述語で複数キーを利用する場合は一か所で
  • 集合よりも結合を先に
  • ビューを使いすぎない

 

-Database
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

DBUtils活用 その2

以前DBUtilsの活用を書きましたが、他の使い方がわかったのでメモ 以前はSelectでList<エンティティ>を取得したのですが、List<Map>でも取得できます。 ソー …

no image

NOT EXISTSの利用2

今回もNOT EXISTSの利用です。 前回の問題にプラスアルファし、列が一緒でないと連続でも意味ない仕様にします。 例えば下記のようなテーブルがあるとします。 seat | row_id | sta …

no image

JPAでのリレーション(アノテーション使用)

JPAでリレーションを管理するとき、最初はアノテーションでやろうとしたんですが、結局やり方がわからずコンストラクタ式をかいて対処してました。 JPAでのリレーションに関して 外部キー制約があるやり方は …

no image

SQL基礎 結合に関して

SQL実践入門を読んで勉強しておりますが、本日は結合に関して。 Contents1 クロス結合2 内部結合3 外部結合4 結合のアルゴリズムとパフォーマンス4.1 NestedLoops4.2 Has …

no image

テーブル設計に関するメリデメ

昨日も書いた記事なんですが、基本的に実装にしても設計にしてもこれが最強っていう手法はなくて(あったとしたら全員がそれを使うのでそもそも選択肢という概念がなくなる・・)メリットデメリットをしっかりと考慮 …

アーカイブ