SQL Antipatterns ch19 Implicit Columns

SQL勉強メモ

出典: 


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

  • ぽかよけ
  • fail early principle

    • トラブルシューティングしやすくなる

You Ain’t Gonna Need It

  • 開発・テスト中はSQLクエリ結果のトラフィックは無害に見える
  • 本番環境で牙をむく

    • 秒間何千ものクエリが飛び交う
  • *を捨てると、select listにカラムを明示することになる
  • すると、「タイプ量を減らしたい」という思いから、余計なカラムをフェッチしなくなるはず
  • 帯域を少なくできる

You Need to Give Up Wildcards Anyway

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

    • エイリアス定義
    • 関数適用
    • select listから除く