Código de formato de consultas SQL

17

¿Debo romper las consultas SQL en diferentes líneas? Por ejemplo, en el proyecto en el que estoy trabajando, ¡tenemos una consulta que toma 1600 columnas! Más de 1600 caracteres de tabulación. Escribí consultas como esta:

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

Pero me exigieron que los pusiera en una línea y dijeron que mi estilo es de mal formato. ¿Por qué es una mala práctica?

GorilaApe
fuente
La objeción puede ser el uso de comillas interpoladas (comillas dobles) y concatenación ( .), que he visto que algunos programadores culpan por los costos de rendimiento.
Bruce Alderson el
3
¿Se requiere que todo esté en 1 línea? Hola barra de desplazamiento, adiós legibilidad.
mike30
1
@BruceAlderson Suena como uno de esos artículos de principios de la década de 2000 "Housewife descubre 3 consejos simples para optimizar su PHP". La verdadera bandera roja con comillas dobles y / o concatenación se produce cuando comienza a insertar variables sin escapar adecuadamente creando ataques de inyección SQL.
Sean McSomething
1
¿Se utilizan herramientas "internas" para procesar los archivos?
Ian
¿Por qué es tan difícil de entender que, siempre y cuando le paguen por el código, debe escribir código limpio, ordenado y ordenado?
Tulains Córdova

Respuestas:

33

Por razones de control de fuente, tenemos saltos de línea después de cada cláusula where o coma. Entonces tu anterior se convierte en

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

(la tabulación y la alineación no tienen un estándar aquí, pero las comas generalmente son iniciales)

Aún así, no hay diferencia de rendimiento.

brillante
fuente
55
Buena idea, esto haría que un pequeño cambio se destaque muy bien en un control de fuente diff.
Carson63000
Prácticamente el mismo formato que uso, aunque generalmente pongo toda la lista de selección en una sola línea (o varias líneas si hay muchas columnas)
Dean Harding
77
Diseño similar aquí, la única diferencia es la coma principal, la tenemos al final.
DBlackborough
44
@ m.edmondson: la diferencia entre versiones en el control de origen resalta los cambios línea por línea. Con este formato, cada línea contiene un solo bit de información: un nombre de columna, un nombre de tabla, una cláusula de unión u orden, lo que significa que el diferencial apuntará directamente a lo que ha cambiado, no solo a una línea con muchas cosas activadas y lo dejará para averiguar qué es diferente.
Jon Hopkins el
2
Este formato también facilita comentar elementos individuales durante el desarrollo y utilizar cortar y pegar para cambiar el orden.
Chris Nava
14

Parece que una consulta de 1600 columnas necesita una revisión seria por parte de un buen DBA.

Si una consulta es compleja, la envolveré. Si es sencillo, lo dejaré como una sola línea a menos que sea demasiado largo, luego comenzaré a envolverlo nuevamente.

Se trata de la capacidad de administración y de comprender lo que se supone que debe hacer, por lo que el ajuste o no ajuste se puede decidir sobre la marcha, a menos que su organización tenga algunas reglas de formato de código al respecto.

Re: siendo una mala práctica de codificación. ¡Apenas! Es muy buena practica. No hay buenas razones que conozco para usar una consulta tan larga, y muchas buenas razones para volver a formatearla. Como dije antes, un DBA experto probablemente necesite trabajar en ello.

el hombre de hojalata
fuente
3
De acuerdo, todo se reduce a la legibilidad realmente. El rendimiento, etc., no se ve afectado por esto en absoluto, todo es solo estético.
Christian
De acuerdo en que el rendimiento no puede ser un buen argumento.
The Tin Man
No lo sé ... solo me dijo que lo mantuviera en una línea, tal vez porque lo hacen
GorillaApe
Probablemente tengan miedo de tocarlo si es un código "heredado". Solo retroceda lentamente y todo estará bien.
The Tin Man
Su nuevo código ...
GorillaApe
8

La única ventaja de las consultas de línea única que viene a la mente es que esas consultas pueden ser algo más fáciles de entender. Aparte de eso, sin embargo, estoy perplejo. Personalmente, prefiero las consultas divididas más legibles.

leed25d
fuente
6

Los comentarios de varias líneas son buenos, casi vitales cuando se trata de grandes volúmenes de SQL. Y si su lenguaje de programación tiene citas heredoc, es aún mejor (ya que muchos editores pueden resaltar la sintaxis SQL en ellas).

Ejemplo:

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

Al trabajar con consultas de docenas de líneas (o cientos), tanto la sangría como el espacio en blanco hacen que el texto sea viable.

Bruce Alderson
fuente
1
Para PHP, nowdocs es la variedad entre comillas simples (es decir, sin sustitución de variables).
Alan Pearce
4

Parece que esto se trata específicamente de definir una consulta grande dentro de un lenguaje de programación, ver que colocas la consulta dentro de un literal de cadena y la concatenas.

Si se trata de un lenguaje compilado, no debería haber ninguna diferencia: una de las primeras optimizaciones que haría el compilador es concatenar automáticamente los literales de las cadenas, de modo que termines con una cadena grande de todos modos.

En cuanto a la sintaxis, debería considerar mover la consulta fuera de su código: almacénela en un archivo de recursos .sql separado y haga que su software lea ese archivo. Utilice declaraciones preparadas para las variables, si no se trata de una consulta que se construye dinámicamente (es decir, cláusulas where, etc., agregadas según ciertos parámetros). Si se construye dinámicamente, puede agregar variables de reemplazo propias, insertando parámetros adicionales donde y cuando sea necesario.

En cuanto a las 1600 columnas, recomiendo seriamente construir una vista para eso, así que en lugar de

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

obtendrías

SELECCIONE * DESDE viewX DONDE y

Mucho más conciso en su propio código.

Cthulhu
fuente
+1, y también consideraría convertir la consulta en un procedimiento almacenado
Larry Coleman
1

A menudo uso el formato presentado por @glasnt para solucionar problemas de una consulta complicada, sin embargo, generalmente tengo consultas en una sola línea.

Es posible que esto no responda a su pregunta, pero también sugeriría dividir su consulta en consultas más pequeñas. Obviamente, esto depende de la consulta, pero cuantas más cláusulas y uniones agregue a su consulta, menos podrá el motor SQL optimizar su consulta.

El proveedor de su base de datos debe tener herramientas como EXPLAIN de MySQL (o la configuración SHOWPLAN_ALL de MSSQL) que le mostrarán qué está haciendo la base de datos detrás de escena para optimizar su consulta, cada vez que la base de datos tiene que crear una tabla temporal o algo así, está agregando grandes retrasos cuando habla de múltiples usuarios concurrentes.

Al mover lo que podría parecer una lógica trivial fuera del SQL y en su código, puede proporcionar incrementos drásticos en el rendimiento: SQL es excelente en operaciones simples.

El beneficio obvio de esto, ya que podría relacionarse con usted, es que sus consultas son mucho menos complejas y fáciles de leer, fáciles de administrar (no> 1600 columnas) y más rápidas. Definitivamente una victoria completa.

Espero que esto ayude :)

heretik
fuente