Query SQL di formattazione del codice


17

Devo interrompere le query SQL in diverse righe? Ad esempio nel progetto a cui sto lavorando, abbiamo una query che richiede 1600 colonne! 1600 + caratteri tab. Ho scritto domande come questa:

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

Ma mi hanno chiesto di metterli in una riga e hanno detto che il mio stile è una formattazione sbagliata. Perché è una cattiva pratica?


L'obiezione potrebbe essere l'uso di virgolette interpolate (virgolette doppie) e concatenazione ( .), che ho visto alcuni programmatori incolpare per i costi delle prestazioni.
Bruce Alderson,

3
Tutto deve essere su 1 riga? Ciao barra di scorrimento, buona lettura.
mike30

1
@BruceAlderson Sembra uno di quegli articoli dei primi anni 2000 "Housewife scopre 3 semplici consigli per ottimizzare il tuo PHP". La vera bandiera rossa con virgolette doppie e / o concatenazione arriva quando inizi a inserire variabili senza sfuggirle correttamente creando attacchi di iniezione SQL.
Sean McSomething il

1
Vengono utilizzati strumenti "interni" per elaborare i file?
Ian,

Perché è così difficile capire che fintanto che vieni pagato per il codice, devi scrivere codice pulito, ordinato, ordinato?
Tulains Córdova,

Risposte:


33

Per motivi di controllo del codice sorgente, abbiamo interruzioni di riga dopo ogni clausola where o virgola. Quindi il tuo sopra si trasforma in

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

(la tabulazione e l'allineamento non hanno standard qui, ma le virgole sono generalmente in testa)

Tuttavia, non fa alcuna differenza nelle prestazioni.


5
Buona idea, ciò farebbe risaltare molto bene una piccola modifica in una diff di controllo del codice sorgente.
Carson63000,

Praticamente la stessa formattazione che uso, anche se di solito inserisco tutto l'elenco di selezione su una sola riga (o più righe se ci sono molte colonne)
Dean Harding

7
Layout simile qui, l'unica differenza è la virgola principale, ce l'abbiamo alla fine.
DBlackborough,

4
@ m.edmondson: la differenza tra la versione nel controllo del codice sorgente evidenzia le modifiche riga per riga. Con questo formato ogni riga contiene un singolo bit di informazioni - un nome di colonna, un nome di tabella, una clausola join o order - il che significa che il diff punterà proprio su ciò che è cambiato, non solo su una riga con molte cose attive e ti lascerà per capire cosa c'è di diverso.
Jon Hopkins,

2
Questo formato semplifica inoltre il commento di singoli articoli durante lo sviluppo e l'uso di taglia e incolla per modificare l'ordine.
Chris Nava,

14

Una query di 1600 colonne suona come se avesse bisogno di una revisione seria da parte di un buon DBA.

Se una query è complessa la avvolgerò. Se è semplice lo lascerò come una riga singola a meno che non sia troppo lungo, quindi ricomincerò a racchiuderlo.

Riguarda la gestibilità e la comprensione di ciò che dovrebbe fare, quindi il wrapping o il non wrapping può essere deciso al volo, a meno che l'organizzazione non abbia alcune regole di formattazione del codice al riguardo.

Ri: è una cattiva pratica di programmazione. Quasi! È un'ottima pratica. Non ci sono buoni motivi che conosco per usare una query così a lungo, e molti buoni motivi per riformattarla. Come ho detto prima, un esperto DBA probabilmente ha bisogno di lavorarci sopra.


3
D'accordo, tutto si riduce davvero alla leggibilità. Le prestazioni ecc. Non ne risentono affatto, è solo estetico.
Christian,

Concordo sul fatto che le prestazioni non possono essere un buon argomento.
Tin Man,

Non lo so .. mi hanno appena detto di tenerlo in una riga, forse perché lo fanno
GorillaApe

Probabilmente hanno paura di toccarlo se è un codice "legacy". Appena lentamente indietro e tutto andrà bene.
Tin Man,

Il suo nuovo codice ...
GorillaApe

8

L'unico vantaggio delle query a riga singola che viene in mente è che quelle query possono essere in qualche modo più facili da esaminare. A parte questo, però, sono perplesso. Personalmente, preferisco le query più leggibili e suddivise.


6

I commenti multilinea sono buoni, quasi vitali quando si tratta di grandi volumi di SQL. E se il tuo linguaggio di programmazione ha citazioni ereditate, è ancora meglio (poiché molti editor possono evidenziare la sintassi SQL in esse).

Esempio:

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

Quando si lavora con query di dozzine di righe (o centinaia) sia il rientro che lo spazio bianco rendono il testo praticabile.


1
Per PHP, nowdocs è la varietà a virgoletta singola (ovvero nessuna sostituzione variabile).
Alan Pearce,

4

Sembra che si tratti in particolare di definire una grande query all'interno di un linguaggio di programmazione di sorta, vedendoti mettere la query in una stringa letterale e concatenarla.

Se è un linguaggio compilato, non dovrebbe fare alcuna differenza: una delle prime ottimizzazioni che il compilatore farebbe è concatenare automaticamente i valori letterali delle stringhe, in modo da finire comunque con una stringa grande.

Per quanto riguarda la sintassi, dovresti effettivamente considerare di spostare la query al di fuori del tuo codice: memorizzala in un file di risorse .sql separato e fai leggere il file al tuo software. Utilizzare istruzioni preparate per le variabili, se non è una query creata in modo dinamico (ovvero clausole where ecc. Aggiunte in base a determinati parametri). Se viene creato in modo dinamico, è possibile aggiungere variabili di sostituzione personalizzate, inserendo parametri aggiuntivi dove e quando necessario.

Per quanto riguarda le 1600 colonne, raccomando seriamente di costruirne una vista, quindi invece di

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

otterresti

SELEZIONA * DA viewX DOVE y

Molto più conciso nel tuo codice.


+1 e prenderei anche in considerazione l'idea di trasformare la query in una procedura memorizzata
Larry Coleman,

1

Uso spesso il formato proposto da @glasnt per la risoluzione di una query complicata, tuttavia in genere sono presenti query su una sola riga.

Questo potrebbe non rispondere alla tua domanda, ma suggerirei caldamente di suddividere la query in query più piccole. Ovviamente questo dipende dalla query, ma più clausole e join si aggiungono alla query, meno il motore SQL è in grado di ottimizzare la query.

Il tuo fornitore di database dovrebbe avere strumenti come EXPLAIN di MySQL (o l'impostazione SHOWPLAN_ALL di MSSQL) che ti mostreranno cosa sta facendo il database dietro le quinte per ottimizzare la tua query, ogni volta che il database deve creare una tabella temporanea o qualcosa del genere, stai aggiungendo enormi ritardi quando si parla di più utenti simultanei.

Spostando quella che potrebbe sembrare una banale logica fuori dall'SQL e nel tuo codice, puoi fornire notevoli aumenti delle prestazioni: SQL è eccezionale nelle operazioni semplici.

L'ovvio vantaggio di ciò, poiché potrebbe riguardare te, è che le tue query sono molto meno complesse e facili da leggere - facili da gestire (non> 1600 colonne) e più veloci. Sicuramente una vittoria a tutto tondo.

Spero che sia di aiuto :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.