概要
- SQLアンチパターン は保守性やパフォーマンス低下の原因
- CASE WHENの乱用 や インデックスを活かせない記述 がよく見られる
- **SELECT ** *や SELECT DISTINCT の誤用も注意点
- ビューの多重化 や ネストされたサブクエリ の過剰利用はパフォーマンス悪化の要因
- 設計段階での工夫 と チームでのベストプラクティス共有 が重要
よくある高インパクトSQLアンチパターン
-
大規模CASE WHEN文 のビュー内限定実装
- アプリケーションのステータスコードを 巨大なCASE WHEN で英語化するケース
- 個別ビュー 内でのみ変換ロジックを記述しがち
- 他開発者が コピペ や ロジック未使用 となり、 データ整合性の崩壊 を招く
- ディメンションテーブル や 共通ビュー で一元管理推奨
-
インデックスを活かせないWHERE句
- 例: WHERE UPPER(name) = 'ABC'
- インデックスが効かず 全件スキャン 発生
- 解決策:
- 比較値を 小文字 や 正規化 して保存
- UPPER(name) のインデックス付与
-
**SELECT ** *の安易な使用
- スキーマ変更時に ビューが壊れる リスク
- 不要なカラム まで取得しパフォーマンス低下
-
SELECT DISTINCT による重複排除
- 不完全なJOIN や 誤ったテーブル関係 が原因の重複を 一時的に隠す
- 根本原因を放置し メトリクス不整合 や 集計ミス を招く
- 適切な JOIN条件 の見直しが必須
-
ビュー多重化(View on View)
- 初期は モジュール化・整理 のつもりで実装
- 時間経過とともに 依存関係が複雑化
- パフォーマンス劣化 や デバッグ困難化
- 一定期間ごとに ロジックのフラット化 や マテリアライズ を推奨
-
ネストされたサブクエリの過剰利用
- サブクエリの多重ネストで 可読性・保守性低下
- 例: 3~4層 のサブクエリ+ 5000行超のSQL
- CTE(WITH句) 活用で読みやすさ向上
SQLアンチパターンへの対処とチーム開発
- SQLはシンプルに見えて、システム規模拡大で 複雑化
- アンチパターンは 納期優先や小さな妥協 が積み重なって発生
- 生産コード同様、SQLも 共有・バージョン管理・レビュー・最適化 が重要
- 設計段階の工夫 が 後工程の手戻り防止 につながる
- Bill Karwin著 "SQL Anti-patterns" の参照推奨