it-swarm-fr.com

Formatage du code requis SQL

Devrais-je briser les requêtes SQL dans différentes lignes? Par exemple, dans le projet, je travaille, nous avons une requête qui prend 1600 colonnes! 1600 + TAB caractères. J'ai écrit des questions comme ceci:

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

Mais ils m'ont réclamé de les mettre en une ligne et ont dit que mon style est un mauvais formatage. Pourquoi c'est une mauvaise pratique?

17
GorillaApe

Pour des raisons de contrôle de source, nous avons des lueurs après toutes les clauses, ou une virgule. Donc votre ci-dessus se transforme en

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

(La tabulation et l'alignement n'ont pas de standard ici, mais les virgules sont généralement en tête)

Néanmoins, ne fait aucune différence de performance.

33
glasnt

Une requête qui est de 1600 colonnes sonne comme si elle a besoin d'une crime sérieuse par un bon DBA.

Si une requête est complexe, je l'envelopperai. Si c'est simple, je le laisserai comme une seule ligne à moins que cela ne soit trop long, alors je vais commencer à l'envelopper à nouveau.

Il s'agit de la gestion de la gestion et de comprendre ce qu'il est censé faire de sorte que l'emballage ou non peut être décidé à la volée, à moins que votre organisation dispose de règles de mise en forme du code à ce sujet.

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

14
the Tin Man

Le seul avantage des requêtes de ligne simples qui me vient à l'esprit est que ces requêtes peuvent être un peu plus faciles à faciliter le grep. Autre que cela, cependant, je suis excité. Personnellement, je préfère les requêtes les plus lisibles et divisées.

8
leed25d

Les commentaires multilignes sont bons, presque vital lorsqu'ils traitent de gros volumes de SQL. Et si votre langue de programmation a des citations Heredoc, il est encore meilleur (car de nombreux éditeurs peuvent en surbriller SQL Syntaxe).

Exemple:

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

Lorsque vous travaillez avec des questions de dizaines de lignes (ou de centaines) à la fois l'indentation et l'espace blanche rendent le texte viable.

6
Bruce Alderson

Il semble que cela soit spécifiquement sur la définition d'une grosse requête à l'intérieur d'une langue de programmation, vous voyant mettre la requête à l'intérieur d'une chaîne littérale et concaténate.

Si c'est une langue compilée, il ne devrait faire aucune différence à tout - l'une des premières optimisations que le compilateur ferait est de concaténer automatiquement les littéraux de chaîne ensemble, de sorte que vous vous retrouvez avec une grande chaîne de toute façon.

En ce qui concerne la syntaxe, vous devriez en réalité envisager de déplacer la requête en dehors de votre code - stockez-la dans un fichier de ressources .SQL séparé et de lire votre logiciel. Utilisez des déclarations préparées pour les variables, si ce n'est pas une requête construite de manière dynamique (c'est-à-dire des clauses etc. ajoutées en fonction de certains paramètres). Si elle est construite de manière dynamique, vous pouvez ajouter des variables de remplacement de votre choix, insérant des paramètres supplémentaires où et en cas de besoin.

Quant aux 1600 colonnes, je vous recommande sérieusement de construire une vue pour cela, donc au lieu de

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

tu aurais

Sélectionnez * à partir de ViewX où Y

Beaucoup plus concis dans votre propre code.

4
Cthulhu

J'utilise souvent le format proposé par @glasnt pour résoudre une requête compliquée, cependant, ont généralement des requêtes en une seule ligne.

Cela pourrait ne pas répondre à votre question, mais je vais également suggérer fortement de décomposer votre requête dans des questions plus petites. De toute évidence, cela dépend de la requête, mais des clauses plus et vous rejoint Ajouter à votre requête - moins le moteur SQL est en mesure d'optimiser votre requête.

Votre fournisseur de base de données doit avoir des outils tels que Explan (ou MSSQL's Showplan_all définir) qui vous montrera ce que la base de données se trouve dans les coulisses pour optimiser votre requête, chaque fois que la base de données doit créer une table temporaire ou une autre, vous ajoutez énormes retards lorsque vous parlez de multiples utilisateurs simultanés.

En déplaçant ce qui pourrait sembler comme une logique triviale hors du SQL et dans votre code, vous pouvez fournir des augmentations de performances spectaculaires - SQL est excellente à des opérations simples.

L'avantage évident pour cela que cela pourrait vous rapporter, est que vos requêtes sont beaucoup moins complexes et faciles à lire - faciles à gérer (pas> 1600 colonnes) et plus rapidement. Certainement une victoire complète.

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

1
heretik