SQL文は簡潔に

2019年03月13日

過去の業務経験の中で、
超長いSQL文を 見かけた事があります。

個人的には、SQL文というものは、
ロジックを書くものではなく、
あくまでも簡潔に、データベースに問い合わせるための
言語であると考えます。

なぜ複雑なSQL文を書く必要があったのか

昔はデータベースサーバーは デカい物を使っており、
さらにはアプリを動かすPCには、他のソフトも動かす事を考え、
あまり複雑な処理は 書けなかったわけです。

現在では、基本的にLAMP環境を使う場合が多く、
PCでのアプリは、ブラウザで行われます。
なので 処理を行うのは PCのアプリではなく、サーバーのPHP側なので、
SQL1発で 色々やらなければならない という必要もありません。

JavaScriptで よほどの処理を作らなければ、
PC側での処理は たいした事はありませんが、
JavaScriptでSQLを扱う事は できません。
というか、やったらヤバいです。

今は サーバー内で、PHPという処理を書ける領域があります。
なので、むしろデータベースに問い合わせるSSQL文は、
できる限り分割して、
『どんなデータを取得するのか』を わかりやすいSQL文にし、
『どんな処理を行うのか』を わかりやすいPHP処理を書いていく
というのが、よいでしょう。

部品化を行うためにも

SQLでJOINなどを行う前提の構造だと、
例えば アカウントの属性を知るなどの共通要素を
部品化する事も 不可能です。
いちいちSQLで条件を書いていくという、
非効率的な事を 都度行わなくては ならなくなります。
むしろ、アカウントの属性を取得する部分など、基本中の基本であり、
最初から作っておくべき部分でもあります。

メンテナンスのしやすさ

それに、SQL文を簡潔にするという事は、
万が一にも データベースエンジンが変わってしまうという場合にも、
簡単に対応する事が 可能となります。

エンジンが変わる事は そうそうないとは思いますが、
基礎的なSQLしか使っていなければ、互換性のおかげで、
なんの変更もなしに 使える可能性もありますが、
変更が必要な場合であっても、簡単なSQL文にしておけば、
変更するべき部分が 簡単に判明し、
どのように変更すればよいのかも 簡単にわかります。

SQLサーバーによる負荷の軽減

昔は出力結果までも SQLで算出する必要があったようです。
しかし、今では極力 SQLには負荷をかけない方が正解でしょう。

今では PHPの動くサーバーを増やす事で、
負荷を分散させるという方法が可能です。
しかし、SQLサーバーだけは 負荷分散が難しく、
読み込み専用のサーバーを作るというのが 精一杯です。

書き込みだけは どうしても1つの本体に対して
行わなければならないため、
SQLサーバーには 極力処理の負荷を減らす事を 考えなくてはなりません。
ましてや、書き込みの結果までも計算するロジックも、
SQLで書いていたら、そりゃ負荷の原因になるでしょう。

ちなみに私の経験上、10発連続でSQLを打ったぐらいでは、
どうって事ないと思います。

総括

つまり、SQLは簡潔にするのが、今後システムを構築する上で、
重要な事に なるのではないかという事です。

SQLのアンチパターンにも「スパゲッティクエリ」というものもあり、
やはり複雑で長いSQLは 分割するなりしたほうが よいとの事です。
それにSELECT文は あくまでも「取得するカラムを選択する」所であり、
計算する場所では ありませんからね。

昔から確立された開発方法だからと言って、
それを今持ってきても、時代錯誤な面もありますし、
結局 変えるべきところは変えていかなくてはならないのだと思います。

Pocket