親愛なるジョンからの手紙

雑記です。ゲームとか漫画とかプログラミングとか。

SQLの基礎知識がクソ雑魚だったので勉強しなおした話

ここまでのあらすじ

SQLが遅い。

いやSQLは遅くない。コッド先生をはじめあらゆる著名な開発者が関わり、各ベンダーが極限まで最適化を施したRDBMSは基本的に遅くはない。 遅いのはこの複雑怪奇なデータベースから無理やりデータを取得しようとしている、怖気が走るほどのスパゲッティクエリだ。

「最適化」の名のもとに意味不明な組み立て方をされた文字列の地獄。乱立する連結文字列。JDBCの実行限界ギリギリのパラメータ量。見ているだけで泣きたくなる。

SQLアンチパターンって本あるよね。あれの八割を網羅しているようなデータベース設計。主にメタデータトリブル。そんなクソの山から生み出されるSQLはやはりクソの山なのである。ようこそここが地獄。助けてくれ。

SQLアンチパターン

SQLアンチパターン

とはいえ僕自身もそこまでSQLに強いわけではない。せいぜい実行計画を眺めながら「あーこの辺コストかかってるからサブクエリで絞らないとねー」「インデックス張ろうねー」程度の知識だ。手元で工夫ができるSQL技術の手札などたかが知れている。このままの知識レベルだとリファクタリングという名の泥仕合を繰り広げる未来が見える。さながらレベル1勇者単体でナジミの塔に突入するかの如くだ。

というわけで、改めて基礎からSQLを学んでみようということで本を一冊買って実践してみた。

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

今回のブログは一人読書会感想ブログとなっております。

どんな本?

SQLの実践入門本でした。(クソ雑紹介)

といっても、SQLそのものに入門するには不向きだと思います。SQLの書き方やら何をしてくれるのかという本であればSQLの絵本のほうが向いてると思う。

SQLの絵本―データベースがみるみるわかる9つの扉

SQLの絵本―データベースがみるみるわかる9つの扉

「ORM?結局定義書くのめんどくさくね?オブジェクトマッピングだけしてくれればええやんけ。Dapperとかsql2oとかそもそもDjangoのModelみたいにしてくれれば楽じゃろ」といった感じにSQLをざっくりとしか書いたことのないアプリケーションエンジニアが、1年目~3年目くらいの期間に見てみるとちょうどいいんじゃないかなー、という印象です。

内容としては大雑把に「DBMSアーキテクチャ」「DBMSで利用されているアルゴリズムの紹介」「実行計画の見方」「モデルケースをもとに遅くなる原因とチューニング方法を紹介」といった感じで、SQLそのものよりも、クエリ実行が遅くなった際に原因を特定する方法や、ハマりやすいケースへの対処集といった感じでした。

その対処の方法も、SQLでベースとされている集合指向的な解決法だけに限ったわけでなく、そもそものデータモデル設計を変える、適切にループを利用する(本書内ではぐるぐる系と称されている)等々、パフォーマンスを出すために様々な方向性からアプローチを行っていました。

そのアプローチ方面も実際に現場で「あるある」というようなパターンが多々。そういう意味では「SQL」実践入門というより、「SQL実践」入門といったような感じ。

実際読んでみて非常に良かったです。今まで適当に読んでた実行計画読むのが楽しくなった。

使えそうだったテクニック

ウィンドウ関数

集約とカットのうち、カットのみを行う手法。使い方全然知らなかった……。 GROUP BYやら集約関数自体はごにょごにょやっていたことはあるのだけれど、基本的に集計する目的やCOUNT以外では利用していなかったので「こんな方法もあるのか!」と素直に感動。

集約関数 OVER (
  PARTITION BY column
  ORDER BY column
)

めっちゃ使いやすいですねコレ……。

ウィンドウ関数を利用したパフォーマンス向上の方法も例として多々あり、実用の方向性としては多々ありそうな感じ。

スキャン・結合アルゴリズム

一番欲しかった情報。EXPLAINしてみて「なんかよくわからんけど全検索かけてるっぽいところあるからここが遅いやろ……」みたいなことが多かったので、問題点を確定させられるような情報を仕込めたのは最も大きな収穫でした。

再起クエリ

ナイーヴツリーの解決法。SQLアンチパターンにもあったね。

メインで利用しているRDBMSPostgreSQLなのでこの辺はちょいちょい利用してます。

ところでこの辺の解決法で経路列挙モデルと入れ子集合モデルが結構あげられるけど、アレ本当に使えるのか……?って毎回思ってしまう。

こういう人は必要ないかも

がっつり読み込んでみて感じたのは、徹底的に特定のベンダーに依存する実装を排除してるなー、という印象でした。

例えば大量データのテーブルに対してデータマートでの分割を提案してるのですが、SQLアンチパターンでは同様のパターンについてパーティショニング・シャーディングを用いて解決しようとしています。(これでデータマートの実装方法がパーティショニングだったら恥ずかしいな)

なので、SQL標準から外れた機能や、特定のDBMS拡張機能についてチューニングしようとしている場合は、専用の本買ったほうがいいかもしれません。実践ハイパフォーマンスMySQLとか。

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

まとめ

改めてSQLを勉強しなおすのに良い本でした。普段メインでDB触らないアプリケーションエンジニアにとってはさらにポイント倍。

実装は一通り表面だけでも手札そろえられたので、次に読むなら設計系かなー。

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

もっと詳細にSQL実装の方面掘るならプログラマのためのSQLあたりでしょうか。

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

なんにせよ、SQLないしはRDBMSの知識を得るにあたって指標となる一冊になりました。ミック先生全然知らなかったけどこれを機に覚えておこう。