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