コードフォーマッティングSQLクエリ


17

SQLクエリを別の行に分割する必要がありますか?たとえば、私が取り組んでいるプロジェクトでは、1600列を使用するクエリがあります!1600 +タブ文字。次のようなクエリを作成しました。

   "SELECT bla , bla2 , bla FROM bla " . 
     "WHERE bla=333 AND bla=2" . 
      "ORDER BY nfdfsd ...";

しかし、彼らは私にそれらを一行に入れるよう要求し、私のスタイルは悪いフォーマットだと言った。なぜそれが悪い習慣ですか?


異論は、補間された引用符(二重引用符)と連結(.)の使用にある可能性がありますが、一部のプログラマーはパフォーマンスコストのせいにします。
ブルースアルダーソン

3
すべてが1行である必要がありますか?こんにちはスクロールバー、さようなら読みやすさ。
mike30

1
@BruceAlderson 2000年初頭の「主婦がPHPを最適化するための3つの簡単なヒントを発見した」記事のように聞こえます。変数を適切にエスケープせずに変数を挿入し始めると、二重引用符や連結が付いた真の赤い旗が現れ、SQLインジェクション攻撃が発生します。
ショーンマクサムシング

1
ファイルの処理に使用される「社内」ツールはありますか?
イアン

コードにお金を払っている限り、書き込み、クリーン、整頓、整然としたコードを保持することを理解するのはなぜ難しいのですか?
Tulainsコルドバ

回答:


33

ソース管理上の理由から、すべてのwhere句またはコンマの後に改行があります。あなたの上記は

SELECT bla 
     , bla2 
     , bla 
FROM   bla 
WHERE  bla=333 
  AND  bla=2
ORDER  BY nfdfsd
        , asdlfk;

(タブと整列はここでは標準ではありませんが、通常はコンマが先行します)

それでも、パフォーマンスの違いはありません。


5
良いアイデアです。これにより、ソース管理差分で小さな変更が非常にうまく目立つようになります。
Carson63000

私は(列の多くがあるかどうか、複数行)私は通常、単一の行に選択リストのすべてを入れても、使用とほとんど同じフォーマット
ディーン・ハーディング

7
ここでは同様のレイアウトですが、唯一の違いは先頭のコンマであり、最後にあります。
DBlackborough

4
@ m.edmondson-ソース管理のバージョン間の差分は、行ごとに変更を強調表示します。この形式では、各行に1列の情報(列名、テーブル名、結合または順序句)が含まれます。つまり、diffは、多くのものが入っている行だけでなく、変更されたものを直接指します。何が違うのかを理解するために。
ジョンホプキンス

2
また、この形式により、開発中に単一のアイテムを簡単にコメントアウトしたり、カットアンドペーストを使用して順序を変更したりできます。
クリスナヴァ

14

1600カラムのクエリは、優れたDBAによる真剣なレビューが必要なようです。

クエリが複雑な場合は、ラップします。簡単な場合は、長すぎる場合を除き、1行のままにしておきます。その後、再度ラッピングを開始します。

組織がコードのフォーマット規則を持っている場合を除き、管理性と実行する内容を理解することが重要です。

再:それは悪いコーディング習慣です。ほとんどない!非常に良い習慣です。長い間クエリを使用する理由はありませんが、再フォーマットする理由はたくさんあります。前に言ったように、熟練したDBAはおそらくそれに取り組む必要があります。


3
同意して、それは本当に読みやすさに帰着します。パフォーマンスなどは、これによる影響を受けません。
クリスチャン

パフォーマンスは良い議論になれないことに同意します。
ティンマン

私はちょうど彼らがやるかもしれないので、1行でそれを維持するために私に言った...知らない
GorillaApe

それが「レガシー」コードである場合、彼らはおそらくそれに触れることを恐れています。ゆっくりと戻り、すべてが正常になります。
ティンマン

その新鮮なコード...
GorillaApe

8

頭に浮かぶ単一行のクエリの唯一の利点は、それらのクエリがgrepの方がいくらか簡単な場合があることです。しかし、それ以外は困惑しています。個人的には、より読みやすく分割されたクエリの方が好きです。


6

複数行のコメントは適切であり、大量のSQLを扱う場合にほぼ不可欠です。また、プログラミング言語にヒアドキュメントの引用符が含まれている場合は、さらに優れています(多くのエディターがSQL構文を強調表示できるため)。

例:

$a = SQL<<<
    SELECT a, b, c, d
    FROM Foo f
    WHERE f.a = ?
SQL;

数十行(または数百行)のクエリを使用する場合、インデントと空白の両方によりテキストが機能します。


1
PHPの場合、nowdocsは単一引用符で囲まれた種類です(つまり、変数の置換はありません)。
アラン・ピアース

4

これは、特定の種類のプログラミング言語内で大きなクエリを定義すること、具体的にはクエリを文字列リテラル内に配置して連結することを意味しているようです。

コンパイルされた言語であれば、まったく違いはありません-コンパイラが行う最初の最適化の1つは、文字列リテラルを自動的に連結することであるため、とにかく大きな文字列になります。

構文については、コードの外部にクエリを移動することを実際に検討する必要があります。別の.sqlリソースファイルに保存し、ソフトウェアにそのファイルを読み取らせます。動的に構築されるクエリではない場合は、変数に準備されたステートメントを使用します(つまり、特定のパラメーターに応じてwhere句などが追加されます)。動的に構築される場合は、独自の置換変数を追加し、必要な場所に必要なときに追加のパラメーターを挿入できます。

1600列については、そのためのビューを作成することを真剣にお勧めします。

SELECT column1, column2, .... column1600 from X where Y

あなたは得るだろう

SELECT * FROM viewX WHERE y

独自のコードでさらに簡潔に。


+1、およびクエリをストアドプロシージャにすることも検討します
ラリーコールマン

1

私はしばしば@glasntによって出された形式を使用して、複雑なクエリのトラブルシューティングを行いますが、通常、クエリは1行で行われます。

これはあなたの質問に答えないかもしれませんが、クエリを小さなクエリに分解することも強くお勧めします。明らかにこれはクエリに依存しますが、クエリに追加する句と結合が増えると、SQLエンジンがクエリを最適化できなくなります。

データベースベンダーは、データベースが一時テーブルなどを作成するたびにクエリを最適化するためにデータベースが舞台裏で何をしているのかを示すMySQLのEXPLAIN(またはMSSQLのSHOWPLAN_ALL設定)のようなツールを用意する必要があります複数の同時ユーザーについて話しているときの大きな遅延。

些細なロジックのように見えるものをSQLからコードに移動することにより、劇的なパフォーマンスの向上を実現できます。SQLは単純な操作に優れています。

これに関連する明らかな利点は、クエリがはるかに複雑で読みにくく、管理しやすく(1600列以上ではない)、高速であることです。間違いなくオールラウンド勝利。

お役に立てれば :)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.