読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

【SQLアンチパターン】アプリケーションのコードでSELECT * (ワイルドカード)はやめよう

SQL リファクタリング

アプリケーションのコードで SELECT * (ワイルドカード)としてカラム名を省略するのは、アンチパターンです。
SQLアンチパターンという名書でも紹介されています。
18章 インプリシットカラム(暗黙の列)

SELECT * がダメなのは、あくまでアプリケーション側でハードコードされたSQLについて述べています。
調査などで直接、DBに入り SELECT * とする分には問題ありません。
ただし、BigQueryのように大量のデータを検索する際は、絞ったほうが良いでしょう。

SELECT * のメリットとデメリット

カラム名の省略は、アンチパターンです。
カラムを省略せずに、きちんとカラム名を指定しましょう。

では、なぜカラム名の省略がアンチパターンなのか?
カラム名の省略のメリットとデメリットを並べてみます。

メリット

  • タイプ数が、圧倒的に少なく可読性がよい
  • 開発時の効率がよい

こんなところかな。

    $sql = 'SELECT * FROM USER';

デメリット

メリットに比べ、デメリットはたくさんあります。

  • パフォーマンス面
    • アプリケーションサーバとDBサーバ間で必要以上の帯域幅を使用する
    • 必要以上にメモリを消費する

カラム名を省略すると、実際の処理に必要のないカラムまでDBから取得することになります。


  • メンテナンス性が悪い

もし、テーブルのカラムを削除したり、名前変更した場合、実行エラーになりません。
実行エラーにならず、処理は継続され削除されたカラムを参照しようとした別のコードで、エラーになります。
ということは、エラーになった原因を特定するのが難しくなります。

影響範囲を小さくするために、参照( SELECT )の時点でエラーにするべきです。

カラム名は指定しよう

上記のメリットとデメリットを考慮した上で、考えるべきポイントは、どちらが長期にわたって生産的かというところだと思います。
カラム名を省略すると、初回の開発効率は良いと思いますが、システムのライフサイクルを考えると僅かな時間のはずです。

何度もシステムをメンテナンスし成長させていくには、カラム名を省略しないほうが生産的です。