読者です 読者をやめる 読者になる 読者になる

【SQLの書き方とAPIファースト開発セミナー】に参加しました

SQLの書き方とAPIファースト開発セミナーに参加してきたので、そのメモになります。

はじめに

勉強会開催ページでは、下記内容が案内されていて、

SQLは文法ではなくイメージから考える!
テーブル設計はコーディングのあとで行うべし!

そんなばかな!と思いながらも、興味があったのと最近SQLのパフォーマンスの件で困っていたので参加してみたのですが、結果的にとても学びのある勉強会でした。

学んだこと

APIファースト

ウォーターフォール開発では、テーブル設計の変更が必ず起こるので、テーブル設計は後回し、UIを確定してからテーブル設計を行う。

  • 手法
    エクセルでダミーデータを作成し、ストアドプロシジャーを使用して、データベースを作成しないでUIを作成する。先に動くものをユーザーに見せてから、要件を確定しデータベースの設計を行う。
     
  • 利点
    • ユーザーにイメージしやすいものが見せれるので手戻りがすくない
    • エクセルなので簡単にダミーデータをつくれる
    • join とか考えなくてよい
    • 作成したダミーデータがそのままテストデータにもなる

※ 実際に講師の方が作成したエクセルのマクロを使用して、一連の動作のデモをみました。受託開発においては、ユーザーが実際にUIをみないとイメージできず手戻りが発生することがあるのと、テーブル設計の修正はかなりの工数を伴うと思うので、開発側とユーザー側の視点にも沿った合理的なやり方だなと感じました。

SQL小ネタ集

※ 私がoracleを使用しているので、oracleの内容だけをメモしています。実際には他のDBについての言及もありました。

CPUの動作と実行計画

  • RDBMSはブロック単位でレコードを保持しているため、1レコード読むのに、かならずブロック(8kByte)でよまれる。
  • indexで読むと1レコード8kbかかるので、index使わない方がいいことがある。
  • 実行計画にそったきれいなSQLで1回でよむことが、3回にわけてよむよりも DBのCPU負荷が下がる。
  • ネットワークの処理も1回で読んだ方が効率的。
  • 負荷は高さではなく、面積で考える。
  • スケールアウトのためにjOINを避けない。
  • Oracleの場合、ストアドプロシジャーを使うのがよい。依存関係がわかるので、保守性があがる。

RDBMSの違い

  • オラクル v$SQL (仮装テーブル)便利!
    • 実行されたSQLが取得できる
    • 処理に使用したCPU時間などがわかる
  • oracleは全体の10%(?)失敗すると、実行計画を作り直す。
  • MySQlはjoin が遅い。ハッシュjoinがないので。

パラメータテーブル

  • 複雑なロジックを使用して取得しなければならないようなデータの場合、まずはExcelで1行ずつ取得結果のデータを書きだしてから、ロジックに関わるデータを抽出し、そのデータをパラメータテーブルとして作成する。(if分で条件分岐するより、論理値での計算でできる。)
  • ロジックが増えた時に、テーブルに1行追加するだけでOKなので、保守性もあがる。

論理演算を復習しよう

SQLは論理演算に強いと、すぐイメージできる

  • AND(論理積)は掛け算
  • OR (論理和)は足し算
  • 演算の順番も掛け算(AND)が先
  • 論理和の場合、True が1個でもあれば1
  • 論理積の場合、False が一個でもあれば0

さいごに

勉強会で使用した資料は終わった後に頂けるということで、自分が参加時にメモした内容は以上になりますが、その他SQLの書き方など、参考になる点がたくさんありまりた。もしかしたら、私の理解が間違っている箇所もあるかもしれませんが、その辺はご了承ください。