makopi23のブログ

makopi23が日々の生活で感じたことを気ままに綴るブログです。

SQLアンチパターン読書会 「アンビギュアスグループ」に参加しました

2014/2/6(木) SQLアンチパターン読書会 「アンビギュアスグループ」に参加してきました。

DoorKeeper
http://sqlap.doorkeeper.jp/events/8807

以下の書籍をターゲットとした読書会なのです。
SQLアンチパターンSQLアンチパターン
(2013/01/26)
Bill Karwin

商品詳細を見る


場所はいつもの湯島、株式会社アルティネットさんです。
いつも会場提供ありがとうございます。

参加者は10人かな。
今回は14章「アンビギュアスグループ(曖昧なグループ)」が対象範囲でした。


■14章「アンビギュアスグループ」の説明

今回は @grimrose さんがスライドを作成して紹介してくださいました。



14.5.6節の値連結について、書籍には無いPostgreSQLのARRAY_AGG関数が紹介されています。
あと、GroovyとGradleとPostgreSQL9.xを使ったデモもありました。


こーゆう試みは素晴らしいですね~



■ディスカッション
今回もディスカッションしたいネタをみんなで付箋に書き出しました。
20140206_sqlap1.jpg

あと、私が14章を写経した時に使ったInsert文を一応貼っておきます~。写経したい方はどうぞ。
sqlap_Chapter14_InsertData.txt


DDLとDMLはO'Reillyの書籍サイトに公開されているサンプルコードを使ってくださいな。
http://www.oreilly.co.jp/books/9784873115894/#files

以下、ディスカッション時の個人メモ。
---

■SQL補完をサポートするIDE
・IntelliJ IDEAとかPhpStormは、プログラムの中でもSQLを書くと補完してくれる。型まで付いてくる。
・構文解析しやすい言語はIntelliJ IDEAとかPhpStormとかはお奨め。


■相関サブクエリと導出テーブル
・一般的に、導出テーブルの方が相関サブクエリより実行速度が速い。
・導出テーブルはクエリ実行が1回で済むが、仮想テーブルを作成するためメモリ消費量が大きくなる。


■14.5.4節 JOINを使用する
・サブクエリの中にエイリアス b2 を定義しているが、b2はサブクエリ外でも使用できる。
 → サブクエリの括弧の中にスコープがあるように誤解しやすい。
・このSQLは、集合をズラしてnullを狙い撃ちするイメージ。
・JOINをモリモリ使うとスパゲッティクエリ(17章)に繋がる恐れがあるので注意が必要。


■14.5.6節 グループごとにすべての値を連結する
・PostgreSQLは8.4から、値連結の集約関数としてARRAY_AGGが使用できる。
 http://www.postgresql.jp/document/8.4/html/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE
・カンマによる値の連結は、カラムのデータ自体にカンマが入っていると使えない。1章のジェイウォークになる。
・GRUOP_CONCAT関数もARRAY_AGG関数もSQL標準でサポートされていない。
・MySQLでGRUOP_CONCAT関数を使って連結した際に、途中の1024文字目で打ち切られたことがあったので注意が必要。
・値連結は、テーブルの縦方向の関係を横方向に繋げ直すイメージ。


■解決策の選択指針
・基本アプローチは、まず14.5.3節の「導出テーブル」で出来ないかを考える。
・導出テーブルでパフォーマンスや容量で問題になったら、14.5.4節の「JOINを使用する」で頑張る。
・14.5.4節のLEFT OUTER JOINは慣れると応用テクニックになる。
 → ただし、集合をズラしてデータを取るのはSQLならではで、覚えると強くなるが、人に説明するのが大変・・・
・なので、コストパフォーマンスは14.5.4節の「JOINを使用する」よりは14.5.3節の「導出テーブル」の方が勝る。


■SQLの複雑度
・副問い合わせ(サブクエリ)はWITH句で代替できることがあり、複雑なSQLを分かりやすく見せられる。
・SQLの複雑度、性能、集合論は分けて考える。
・長いSQLは途中の過程をトレースできない。
 → 複雑なSQLを複数に分割すると、個別のSQL結果をトレースできるようになる。
・長いSQLにはコメントを付けましょう。


■AS句によるエイリアス
・カラムへのエイリアスにはASを付け、テーブルのエイリアスにはASを付けない、という派が多い。
・カラムへはASを付けないとエラーになる。
・テーブルへはASを付けても付けなくても良い。
・テーブルへはASを付けないことが多いが、カラムとテーブルの両方にASを付ける派もある。


■Window関数
・結果セットを部分的に切り出した領域に集約関数を適用できる、拡張されたSELECTステートメントのことらしい。
・特定の切り口ごとに集計ができる。
・Windows関数はSQL標準のものと、SQL標準ではないものがある。
・Oracle Database 12cからLimitとOffsetが標準サポートとなった。


■おすすめ書籍
・関係代数や集合演算に関する勉強には以下の書籍がお奨め! by @t_wada さん
達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
(2008/02/07)
ミック

商品詳細を見る



★感想:
14.5節の解決策ですが、副問い合わせが登場して急にSQLが長く複雑になって、ちょっと面喰いますよね・・・
この日の話にも出ましたが、SQLを長くするとスパゲッティクエリに繋がる恐れもあるので、バランスが重要!
SQLの処理をアプリ側に逃がすと、DBインデックスの恩恵を受けられなくこともあるので、その辺は難しいところです。
このくらいのSQLがスラスラ書けて理解できるようになりたいなぁ~

あと、誤植を1つ発見して @t_wada さんにご報告!
これからも見つけられるよう頑張る・・・w

参加者の皆様、ありがとうございました~



■おまけ:過去の「SQLアンチパターン読書会」ブログ

1章:SQLアンチパターン読書会 「ジェイウォーク」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-65.html

2章:SQLアンチパターン読書会 「ナイーブツリー」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-70.html

3章:SQLアンチパターン読書会 「IDリクワイアド」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-73.html

3章:SQLアンチパターン読書会 「続・IDリクワイアド」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-77.html

4章;SQLアンチパターン読書会 「キーレスエントリー」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-84.html

5章:SQLアンチパターン読書会 「EAV(エンティティ・アトリビュート・バリュー)」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-90.html

6章:SQLアンチパターン読書会 「ポリモーフィック関連」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-94.html

7章:SQLアンチパターン読書会 「マルチカラムアトリビュート」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-97.html

8章:SQLアンチパターン読書会 「メタデータトリブル」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-105.html

9章:SQLアンチパターン読書会 「ラウンディングエラー」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-109.html

10章:SQLアンチパターン読書会 「サーティーワンフレーバー」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-115.html

11章:SQLアンチパターン読書会 「ファントムファイル」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-118.html

12章:SQLアンチパターン読書会 「インデックスショットガン」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-121.html

13章:SQLアンチパターン読書会 「フィア・オブ・ジ・アンノウン」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-128.html
関連記事
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://makopi23.blog.fc2.com/tb.php/130-72fd8bd8
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad