Code-Formatierung von SQL-Abfragen


17

Soll ich SQL-Abfragen in verschiedene Zeilen aufteilen? Zum Beispiel haben wir in dem Projekt, an dem ich arbeite, eine Abfrage, die 1600 Spalten belegt! 1600 + Tabulatoren. Ich habe Fragen wie diese geschrieben:

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

Aber sie forderten mich auf, sie in eine Zeile zu setzen und meinten, mein Stil sei schlecht formatiert. Warum ist es schlechte Praxis?


Der Einwand könnte darin bestehen, interpolierte Anführungszeichen (doppelte Anführungszeichen) und Verkettung ( .) zu verwenden, die einige Programmierer für die Leistungskosten verantwortlich gemacht haben.
Bruce Alderson

3
Alles muss in einer Zeile sein? Hallo Bildlaufleiste, auf Wiedersehen Lesbarkeit.
mike30

1
@BruceAlderson Klingt wie einer der frühen 2000er Jahre. "Housewife entdeckt 3 einfache Tipps, um Ihre PHP-Artikel zu optimieren." Die echte rote Flagge mit doppelten Anführungszeichen und / oder Verkettung tritt auf, wenn Sie mit dem Einfügen von Variablen beginnen, ohne sie ordnungsgemäß zu maskieren, was zu SQL-Injection-Angriffen führt.
Sean McSomething

1
Werden interne Tools zum Verarbeiten der Dateien verwendet?
Ian

Warum ist es so schwer zu verstehen, dass man, solange man für Code bezahlt wird, sauberen, ordentlichen Code schreiben muss?
Tulains Córdova

Antworten:


33

Aus Gründen der Quellcodeverwaltung werden nach jeder WHERE-Klausel oder nach jedem Komma Zeilenumbrüche angezeigt. So wird Ihr oben in

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

(Tab und Alignment haben hier keinen Standard, aber Kommas sind normalerweise führend)

Trotzdem macht das keinen Leistungsunterschied.


5
Gute Idee, dies würde eine kleine Änderung in einem Versionskontrolldifferential sehr schön hervorheben.
Carson63000

Ziemlich die gleiche Formatierung wie ich, obwohl ich normalerweise die gesamte Auswahlliste in eine einzelne Zeile (oder mehrere Zeilen, wenn es viele Spalten gibt) setze
Dean Harding

7
Ähnliches Layout hier, der einzige Unterschied ist das führende Komma, wir haben es am Ende.
DBlackborough

4
@ m.edmondson - Unterschiede zwischen den Versionen in der Quellcodeverwaltung heben Änderungen zeilenweise hervor. Bei diesem Format enthält jede Zeile eine einzelne Information - einen Spaltennamen, einen Tabellennamen, eine Verknüpfungs- oder Ordnungsklausel - was bedeutet, dass der Diff direkt auf das zeigt, was sich geändert hat, und nicht nur auf eine Zeile mit vielen Dingen, die Sie betreffen und verlassen herauszufinden, was anders ist.
Jon Hopkins

2
Dieses Format erleichtert es auch, einzelne Elemente während der Entwicklung zu kommentieren und die Reihenfolge mithilfe von Ausschneiden und Einfügen zu ändern.
Chris Nava

14

Eine Abfrage mit 1600 Spalten muss von einem guten Datenbankadministrator gründlich überprüft werden.

Wenn eine Abfrage komplex ist, werde ich sie umbrechen. Wenn es einfach ist, lasse ich es als einzelne Zeile, es sei denn, es wird zu lang, dann beginne ich erneut, es umzubrechen.

Es geht nur um die Verwaltbarkeit und darum, zu verstehen, was zu tun ist. Das Umschließen oder Nicht-Umschließen kann im Handumdrehen entschieden werden, es sei denn, Ihre Organisation verfügt über einige Regeln zur Code-Formatierung.

Betreff: Schlechte Codierpraxis. Kaum! Es ist eine sehr gute Übung. Ich kenne keine guten Gründe, eine Abfrage so lange zu verwenden, und es gibt viele gute Gründe, sie neu zu formatieren. Wie ich bereits sagte, muss ein erfahrener DBA wahrscheinlich daran arbeiten.


3
Einverstanden, es kommt wirklich auf die Lesbarkeit an. Die Leistung usw. wird davon überhaupt nicht beeinträchtigt, es ist alles nur ästhetisch.
Christian

Stimmen Sie zu, dass Leistung kein gutes Argument sein kann.
der Blechmann

Ich weiß nicht ... habe nur gesagt, dass ich es in einer Zeile lassen soll, vielleicht, weil sie es tun
GorillaApe

Sie haben wahrscheinlich Angst, es zu berühren, wenn es sich um "Legacy" -Code handelt. Nur langsam zurück und alles wird gut.
der Blechmann

Sein neuer Code ...
GorillaApe

8

Der einzige Vorteil von einzeiligen Abfragen, der in den Sinn kommt, besteht darin, dass diese Abfragen möglicherweise etwas einfacher zu finden sind. Davon abgesehen bin ich jedoch ratlos. Persönlich bevorzuge ich die besser lesbaren, aufgeteilten Abfragen.


6

Mehrzeilige Kommentare sind gut und fast unverzichtbar, wenn große Mengen von SQL verarbeitet werden. Und wenn Ihre Programmiersprache Heredoc-Anführungszeichen enthält, ist dies sogar noch besser (da viele Editoren die SQL-Syntax in diesen hervorheben können).

Beispiel:

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

Wenn Sie mit Abfragen von Dutzenden von Zeilen (oder Hunderten von Zeilen) arbeiten, können Sie den Text sowohl durch Einrückungen als auch durch Leerzeichen bearbeiten.


1
Für PHP sind nowdocs die Sorte mit einfachen Anführungszeichen (dh keine Variablensubstitution).
Alan Pearce

4

Anscheinend geht es hier speziell darum, eine große Abfrage in einer Art Programmiersprache zu definieren, indem Sie die Abfrage in ein Zeichenfolgenliteral einfügen und es verketten.

Wenn es sich um eine kompilierte Sprache handelt, sollte dies überhaupt keinen Unterschied machen. Eine der ersten Optimierungen, die der Compiler vornehmen würde, besteht darin, die Zeichenfolgenliterale automatisch miteinander zu verknüpfen, sodass Sie sowieso eine große Zeichenfolge erhalten.

In Bezug auf die Syntax sollten Sie tatsächlich in Betracht ziehen, die Abfrage aus Ihrem Code heraus zu verschieben. Speichern Sie sie in einer separaten SQL-Ressourcendatei, und lassen Sie Ihre Software diese Datei lesen. Verwenden Sie vorbereitete Anweisungen für die Variablen, wenn es sich nicht um eine dynamisch erstellte Abfrage handelt (z. B. WHERE-Klauseln usw., die abhängig von bestimmten Parametern hinzugefügt werden). Wenn es dynamisch erstellt wird, können Sie eigene Ersatzvariablen hinzufügen und bei Bedarf zusätzliche Parameter einfügen.

Was die 1600 Spalten betrifft, empfehle ich ernsthaft, eine Ansicht dafür zu erstellen, und nicht

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

du würdest bekommen

SELECT * FROM viewX WHERE y

Viel prägnanter in Ihrem eigenen Code.


+1, und ich würde auch erwägen, die Abfrage in eine gespeicherte Prozedur
Larry Coleman

1

Ich verwende oft das von @glasnt angegebene Format, um eine komplizierte Abfrage zu beheben, habe jedoch normalerweise Abfragen in einer einzigen Zeile.

Dies könnte Ihre Frage nicht beantworten, aber ich würde auch dringend empfehlen, Ihre Anfrage in kleinere Anfragen zu unterteilen. Dies hängt natürlich von der Abfrage ab. Je mehr Klauseln und Verknüpfungen Sie Ihrer Abfrage hinzufügen, desto weniger kann die SQL-Engine Ihre Abfrage optimieren.

Ihr Datenbankanbieter sollte über Tools wie EXPLAIN von MySQL (oder die Einstellung SHOWPLAN_ALL von MSSQL) verfügen, die Ihnen zeigen, was die Datenbank hinter den Kulissen tut, um Ihre Abfrage zu optimieren, jedes Mal, wenn die Datenbank eine temporäre Tabelle erstellen muss, oder solche, die Sie hinzufügen große Verzögerungen, wenn Sie über mehrere gleichzeitige Benutzer sprechen.

Indem Sie die scheinbar triviale Logik aus dem SQL-Code in den Code verschieben, können Sie die Leistung erheblich steigern. SQL eignet sich hervorragend für einfache Vorgänge.

Der offensichtliche Vorteil, den dies für Sie haben könnte, ist, dass Ihre Abfragen viel weniger komplex und einfach zu lesen sind - einfach zu verwalten (nicht> 1600 Spalten) und schneller. Auf jeden Fall ein Allround-Sieg.

Hoffe das hilft :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.