勉強日記

チラ裏

SQL Antipatterns ch19 Implicit Columns

pragprog.com


Implicit Columns

Take all you want, but eat all you take.

  • select list の*を使うな
  • JOIN時に同名のカラムが隠れてしまう
    • Books.title
    • Authors.title
      • salutation的な

Objective: Reduce Typing

  • SELECT文のselect listの*
  • INSERT文のVALUES (DEFAULT,

Antipattern: A Shortcut that Gets You Lost

Breaking Refactoring

  • テーブルにカラムを追加すると
    • INSERT文が動かなくなる
    • 列の位置に依存したアプリケーションコードが動かなくなる

Hidden Costs

You Asked for It, You Got It

  • 「指定した列以外全部取る」ということはできません
  • 全部取るか、指定した列を取るかだけ

How to Recognize the Antipattern

  • implicit columnsを濫用して生じるトラブルのシナリオ
    • 「アプリケーションが動かなくなった。DBから取得したデータのカラムを参照するとき、古いカラム名を使ってしまっているからだ。修正が漏れたらしい」
      • *を使うと影響範囲を調べるのが大変
    • 「ネットワークのボトルネックを調査したところ、DBサーバのトラフィックに原因があることがわかった。フェッチしているデータ量の1/10以下しか表示していない」
      • データフェッチしすぎ

Legitimate Uses of the Antipattern

  • 調査時などの、その場限りのクエリ
    • メンテナンス性不要
  • 結合時、各テーブルについて*を使える
    • 同名のカラムが隠れてしまう問題の回避
  • タイプ量の少なさ、クエリの短さを実行時性能よりも優先するならどうぞ

Solution: Name Columns Explicitly

Mistake-Proofing

You Ain't Gonna Need It

  • 開発・テスト中はSQLクエリ結果のトラフィックは無害に見える
  • 本番環境で牙をむく
    • 秒間何千ものクエリが飛び交う
  • *を捨てると、select listにカラムを明示することになる
  • すると、「タイプ量を減らしたい」という思いから、余計なカラムをフェッチしなくなるはず
  • 帯域を少なくできる

You Need to Give Up Wildcards Anyway

  • カラムを明示することで後で楽できる