Formatage de code requêtes SQL

17

Dois-je interrompre les requêtes SQL sur différentes lignes? Par exemple, dans le projet sur lequel je travaille, nous avons une requête qui prend 1600 colonnes! 1600 + tab tabs. J'ai écrit des requêtes comme celle-ci:

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

Mais ils m'ont demandé de les mettre sur une seule ligne et ont dit que mon style est un mauvais formatage. Pourquoi est-ce une mauvaise pratique?

GorillaApe
la source
L'objection peut être à l'utilisation de guillemets interpolés (guillemets doubles) et de concaténation ( .), que j'ai vu certains programmeurs blâmer pour les coûts de performance.
Bruce Alderson
3
Tout doit être sur 1 ligne? Bonjour barre de défilement, bonne lisibilité.
mike30
1
@BruceAlderson Sonne comme l'un de ces articles du début des années 2000 "Housewife découvre 3 conseils simples pour optimiser votre PHP". Le véritable drapeau rouge avec des guillemets doubles et / ou une concaténation survient lorsque vous commencez à insérer des variables sans les échapper correctement en créant des attaques par injection SQL.
Sean McSomething
1
Des outils «internes» sont-ils utilisés pour traiter les fichiers?
Ian
Pourquoi est-il si difficile de comprendre que tant que vous êtes payé pour coder, vous devez écrire, nettoyer, nettoyer, ordonner le code?
Tulains Córdova

Réponses:

33

Pour des raisons de contrôle de code source, nous avons des sauts de ligne après chaque clause where ou virgule. Donc, votre dessus se transforme en

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

(tabulation et alignement n'a pas de norme ici, mais les virgules sont généralement en tête)

Pourtant, cela ne fait aucune différence de performances.

glasnt
la source
5
Bonne idée, cela ferait très bien ressortir un petit changement dans une différence de contrôle de source.
Carson63000
À peu près le même format que j'utilise, bien que je mette généralement toute la liste de sélection sur une seule ligne (ou plusieurs lignes s'il y a beaucoup de colonnes)
Dean Harding
7
Présentation similaire ici, seule la différence étant la virgule principale, nous l'avons à la fin.
DBlackborough
4
@ m.edmondson - La différence entre les versions dans le contrôle de code source met en évidence les changements ligne par ligne. Avec ce format, chaque ligne contient un seul bit d'information - un nom de colonne, un nom de table, une clause de jointure ou d'ordre - ce qui signifie que le diff pointera directement sur ce qui a changé, pas seulement sur une ligne avec beaucoup de choses et vous laissera pour découvrir ce qui est différent.
Jon Hopkins
2
Ce format permet également de commenter facilement des éléments individuels pendant le développement et d'utiliser le copier-coller pour modifier l'ordre.
Chris Nava
14

Une requête de 1600 colonnes semble nécessiter un examen sérieux par un bon DBA.

Si une requête est complexe, je la terminerai. Si c'est simple, je le laisserai sur une seule ligne à moins que ça ne soit trop long, alors je recommencerai à envelopper.

Tout est question de gérabilité et de compréhension de ce qu'il est censé faire. L'habillage ou non peut être décidé à la volée, à moins que votre organisation n'ait des règles de formatage de code à ce sujet.

Re: c'est une mauvaise pratique de codage. À peine! C'est une très bonne pratique. Je ne connais aucune bonne raison d'utiliser une requête aussi longue et de nombreuses bonnes raisons de la reformater. Comme je l'ai déjà dit, un DBA qualifié doit probablement y travailler.

l'homme d'étain
la source
3
D'accord, tout se résume vraiment à la lisibilité. Les performances, etc. ne sont pas du tout affectées par cela, tout simplement esthétique.
Christian
Convenez que la performance ne peut pas être un bon argument.
The Tin Man
Je ne sais pas .. viens de me dire de le garder sur une seule ligne, peut-être parce qu'ils le font
GorillaApe
Ils ont probablement peur de le toucher s'il s'agit d'un code "hérité". Reculez lentement et tout ira bien.
The Tin Man
Son nouveau code ...
GorillaApe
8

Le seul avantage des requêtes sur une seule ligne qui me vient à l'esprit est que ces requêtes peuvent être un peu plus faciles à comprendre. À part ça, je suis perplexe. Personnellement, je préfère les requêtes fractionnées plus lisibles.

leed25d
la source
6

Les commentaires multilignes sont bons, presque essentiels lorsqu'ils traitent de gros volumes de SQL. Et si votre langage de programmation contient des citations héréditaires, c'est encore mieux (car de nombreux éditeurs peuvent y mettre en évidence la syntaxe SQL).

Exemple:

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

Lorsque vous travaillez avec des requêtes de dizaines de lignes (ou de centaines), le retrait et les espaces rendent le texte réalisable.

Bruce Alderson
la source
1
Pour PHP, nowdocs est la variété à guillemet simple (c'est-à-dire sans substitution de variable).
Alan Pearce
4

Il semble qu'il s'agisse spécifiquement de définir une grande requête dans un langage de programmation, en vous voyant mettre la requête dans un littéral de chaîne et la concaténer.

S'il s'agit d'un langage compilé, cela ne devrait faire aucune différence - l'une des premières optimisations que le compilateur ferait serait de concaténer automatiquement les littéraux de chaîne ensemble, de sorte que vous vous retrouvez avec une grosse chaîne de toute façon.

En ce qui concerne la syntaxe, vous devriez réellement envisager de déplacer la requête en dehors de votre code - stockez-la dans un fichier de ressources .sql distinct et demandez à votre logiciel de lire ce fichier. Utilisez des instructions préparées pour les variables, si ce n'est pas une requête qui est construite dynamiquement (c'est-à-dire des clauses where etc. ajoutées en fonction de certains paramètres). S'il est construit dynamiquement, vous pouvez ajouter vos propres variables de remplacement, en insérant des paramètres supplémentaires où et quand vous en avez besoin.

En ce qui concerne les 1600 colonnes, je recommande sérieusement de créer une vue pour cela, donc au lieu de

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

tu aurais

SELECT * FROM viewX O y y

Beaucoup plus concis dans votre propre code.

Cthulhu
la source
+1, et j'envisagerais également de transformer la requête en procédure stockée
Larry Coleman
1

J'utilise souvent le format proposé par @glasnt pour dépanner une requête compliquée, mais j'ai généralement des requêtes sur une seule ligne.

Cela pourrait ne pas répondre à votre question, mais je vous suggère également de décomposer votre requête en requêtes plus petites. Évidemment, cela dépend de la requête, mais plus vous ajoutez de clauses et de jointures à votre requête, moins le moteur SQL est en mesure d'optimiser votre requête.

Votre fournisseur de base de données devrait avoir des outils comme EXPLAIN de MySQL (ou le paramètre SHOWPLAN_ALL de MSSQL) qui vous montreront ce que la base de données fait en coulisses pour optimiser votre requête, chaque fois que la base de données doit créer une table temporaire ou quelque chose du genre, vous ajoutez d'énormes retards lorsque vous parlez de plusieurs utilisateurs simultanés.

En déplaçant ce qui peut sembler être une logique triviale hors du SQL et dans votre code, vous pouvez augmenter considérablement les performances - SQL est parfait pour les opérations simples.

L'avantage évident, car cela pourrait vous concerner, est que vos requêtes sont beaucoup moins complexes et faciles à lire - faciles à gérer (pas> 1600 colonnes) et plus rapides. Certainement une victoire tous azimuts.

J'espère que cela t'aides :)

heretik
la source