SQLクエリを別の行に分割する必要がありますか?たとえば、私が取り組んでいるプロジェクトでは、1600列を取るクエリがあります。 1600 +タブ文字。私はこのようなクエリを書きました:
"SELECT bla , bla2 , bla FROM bla " .
"WHERE bla=333 AND bla=2" .
"ORDER BY nfdfsd ...";
しかし、彼らは私にそれらを一行に入れるように要求し、私のスタイルは悪いフォーマットだと言いました。なぜそれが悪い習慣なのですか?
ソース管理上の理由から、すべてのwhere句またはカンマの後に改行を入れています。だからあなたの上記はに変わります
SELECT bla
, bla2
, bla
FROM bla
WHERE bla=333
AND bla=2
ORDER BY nfdfsd
, asdlfk;
(ここではタブ移動と整列に標準はありませんが、通常はコンマが先行しています)
それでも、パフォーマンスに違いはありません。
1600列のクエリは、優れたDBAによる真剣なレビューが必要なようです。
クエリが複雑な場合は、ラップします。簡単な場合は、長くなりすぎない限り、1行のままにして、再度折り返します。
組織がコードのフォーマットに関するルールを持っている場合を除いて、ラッピングの可否はその場で決定できるので、管理性とそれが何をすべきかを理解することがすべてです。
再:それは悪いコーディング習慣です。ほとんどない!とても良い習慣です。クエリを長く使用することを知っている正当な理由はなく、再フォーマットする理由もたくさんあります。前に言ったように、熟練したDBAがおそらくそれに取り組む必要があります。
頭に浮かぶ単一行のクエリの唯一の利点は、これらのクエリがgrepのほうが多少簡単になる場合があることです。それ以外に、しかし、私は困惑しています。個人的には、より読みやすく分割されたクエリを好みます。
複数行のコメントは適切で、大量のSQLを処理する場合にはほぼ重要です。また、プログラミング言語にヒアドキュメントの引用がある場合は、さらに優れています(多くのエディターがSQL構文を強調表示できるため)。
例:
$a = SQL<<<
SELECT a, b, c, d
FROM Foo f
WHERE f.a = ?
SQL;
数十行(または数百行)のクエリを処理する場合、インデントと空白の両方によってテキストが機能します。
これは特に、ある種のプログラミング言語内で大きなクエリを定義することに関するもののようです。クエリを文字列リテラルの中に入れて連結するのがわかります。
それがコンパイルされた言語である場合、それはまったく違いがありません-コンパイラが行う最初の最適化の1つは、文字列リテラルを自動的に連結することです。
構文については、実際にクエリをコードの外に移動することを検討する必要があります。それを別の.sqlリソースファイルに格納し、ソフトウェアにそのファイルを読み取らせます。動的に構築されたクエリでない場合(つまり、特定のパラメーターに応じてwhere句などが追加された場合)は、変数に準備済みステートメントを使用します。動的に構築されている場合は、独自の置換変数を追加して、必要な場所に必要なときに追加のパラメーターを挿入できます。
1600列については、そのためのビューを構築することを強くお勧めします。
SELECT column1, column2, .... column1600 from X where Y
あなたは得るでしょう
SELECT * FROM viewX WHERE y
独自のコードでははるかに簡潔になります。
@glasntによって提示された形式を使用して複雑なクエリをトラブルシューティングすることがよくありますが、通常はクエリを1行で記述します。
これはあなたの質問に答えないかもしれませんが、クエリをより小さなクエリに分解することを強くお勧めします。明らかにこれはクエリに依存しますが、クエリに追加する句や結合が多いほど、SQLエンジンがクエリを最適化できなくなります。
データベースベンダーには、MySQLのEXPLAIN(またはMSSQLのSHOWPLAN_ALL設定)などのツールが必要です。これにより、データベースが一時テーブルなどを作成する必要があるたびに、クエリを最適化するためにデータベースがバックグラウンドで実行していることがわかります。複数の同時ユーザーについて話していると、大幅な遅延が発生します。
単純なロジックのように見えるものをSQLからコードに移動することで、劇的なパフォーマンスの向上を実現できます。SQLは単純な操作で優れています。
これに明らかな利点は、あなたに関係しているかもしれませんが、クエリがはるかに複雑でなく読みやすく、管理が簡単(> 1600列ではない)で高速であることです。間違いなくオールラウンドな勝利。
お役に立てれば :)