Consultas SQL de formatação de código


17

Devo interromper as consultas SQL em linhas diferentes? Por exemplo, no projeto em que estou trabalhando, temos uma consulta que ocupa 1600 colunas! 1600 + caracteres de tabulação. Eu escrevi consultas como esta:

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

Mas eles exigiram que eu os colocasse em uma linha e disseram que meu estilo é de formatação ruim. Por que é uma má prática?


A objeção pode estar no uso de aspas interpoladas (aspas duplas) e concatenação ( .), que eu já vi alguns programadores culparem pelos custos de desempenho.
precisa

3
Tudo é necessário para estar em uma linha? Olá barra de rolagem, adeus legibilidade.
precisa saber é o seguinte

1
@BruceAlderson Parece um daqueles artigos do início dos anos 2000 "A dona de casa descobre três dicas simples para otimizar seu PHP". A bandeira vermelha real com aspas duplas e / ou concatenação ocorre quando você começa a inserir variáveis ​​sem escapar adequadamente delas, criando ataques de injeção SQL.
Sean McSomething

1
Existem ferramentas "internas" usadas para processar os arquivos?
Ian

Por que é tão difícil entender que, enquanto você é pago para codificar, deve escrever código, limpo, arrumado e organizado?
Tulains Córdova

Respostas:


33

Por motivos de controle de origem, temos quebras de linha após cada cláusula where ou vírgula. Então, o seu acima se transforma

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

(tabulação e alinhamento não têm padrão aqui, mas vírgulas geralmente são iniciais)

Ainda assim, não faz diferença no desempenho.


5
Boa idéia, isso faria uma pequena alteração se destacar muito bem em um diff de controle de origem.
Carson63000

Praticamente a mesma formatação como eu usar, embora eu costumo colocar toda a lista de seleção em uma única linha (ou várias linhas, se há um monte de colunas)
Dean Harding

7
Layout semelhante aqui, a única diferença é a vírgula principal, e temos no final.
DBlackborough

4
@ m.edmondson - A diferença entre versões no controle de origem destaca as alterações linha por linha. Com esse formato, cada linha contém um único pedaço de informação - um nome de coluna, um nome de tabela, uma cláusula de junção ou ordem - o que significa que o diff apontará diretamente para o que mudou, não apenas para uma linha com muitas coisas ativadas e deixará você para descobrir o que é diferente.
Jon Hopkins

2
Esse formato também facilita o comentário de itens únicos durante o desenvolvimento e o uso de recortar e colar para alterar a ordem.
Chris Nava

14

Uma consulta com 1600 colunas parece precisar de uma revisão séria por um bom DBA.

Se uma consulta for complexa, eu a envolverei. Se for direto, deixarei como uma única linha, a menos que demore muito, então começarei a envolvê-la novamente.

É tudo sobre gerenciamento e compreender o que é suposto fazer para que o agrupamento ou não do agrupamento possa ser decidido em tempo real, a menos que sua organização tenha algumas regras de formatação de código.

Re: sendo uma má prática de codificação. Dificilmente! É uma prática muito boa. Sei que não existem boas razões para usar uma consulta por muito tempo e muitas boas razões para reformatá-la. Como eu disse antes, um DBA qualificado provavelmente precisa trabalhar nele.


3
Concordado, tudo se resume à legibilidade. O desempenho etc não é afetado por isso, é tudo apenas estético.
Christian

Concorde que o desempenho não pode ser um bom argumento.
the Tin Man

Eu não sei .. só me disse para mantê-lo em uma linha, talvez porque eles fazem
GorillaApe

Eles provavelmente têm medo de tocá-lo se for um código "legado". Apenas se afaste lentamente e tudo ficará bem.
the Tin Man

Seu código fresco ...
GorillaApe

8

A única vantagem das consultas de linha única que vem à mente é que essas consultas podem ser um pouco mais fáceis de serem cumpridas. Fora isso, porém, estou perplexo. Pessoalmente, prefiro as consultas mais legíveis e divididas.


6

Os comentários de várias linhas são bons, quase vitais ao lidar com grandes volumes de SQL. E se sua linguagem de programação possui citações heredoc, é ainda melhor (como muitos editores podem destacar a sintaxe SQL).

Exemplo:

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

Ao trabalhar com consultas de dezenas de linhas (ou centenas), o recuo e o espaço em branco tornam o texto viável.


1
Para PHP, nowdocs é a variedade de aspas simples (ou seja, nenhuma substituição de variável).
Alan Pearce

4

Parece que isso é especificamente sobre definir uma grande consulta dentro de uma espécie de linguagem de programação, vendo você colocar a consulta dentro de uma string literal e concatená-la.

Se é uma linguagem compilada, não deve fazer diferença alguma - uma das primeiras otimizações que o compilador faria é concatenar automaticamente os literais das strings, para que você acabe com uma string grande de qualquer maneira.

Quanto à sintaxe, você deve considerar mover a consulta para fora do seu código - armazene-a em um arquivo de recurso .sql separado e faça com que seu software leia esse arquivo. Use instruções preparadas para as variáveis, se não for uma consulta criada dinamicamente (por exemplo, cláusulas where etc. adicionadas dependendo de determinados parâmetros). Se ele for construído dinamicamente, você poderá adicionar suas próprias variáveis ​​de substituição, inserindo parâmetros extras onde e quando necessário.

Quanto às 1600 colunas, recomendo seriamente criar uma exibição para isso, então, em vez de

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

você conseguiria

SELECIONE * DO viewX ONDE y

Muito mais conciso em seu próprio código.


+1, e eu também considere fazer a consulta em um procedimento armazenado
Larry Coleman

1

Costumo usar o formato apresentado por @glasnt para solucionar problemas de uma consulta complicada, mas geralmente tenho consultas em uma única linha.

Isso pode não responder à sua pergunta, mas eu também sugiro dividir sua consulta em consultas menores. Obviamente, isso depende da consulta, mas quanto mais cláusulas e associações você adicionar à sua consulta - menos o mecanismo SQL poderá otimizar sua consulta.

O fornecedor do seu banco de dados deve ter ferramentas como a EXPLAIN do MySQL (ou a configuração SHOWPLAN_ALL do MSSQL), que mostrará o que o banco de dados está fazendo nos bastidores para otimizar sua consulta, toda vez que o banco de dados precisar criar uma tabela temporária ou algo parecido, você está adicionando grandes atrasos quando você está falando sobre vários usuários simultâneos.

Movendo o que pode parecer uma lógica trivial para fora do SQL e para o seu código, você pode fornecer aumentos drásticos no desempenho - o SQL é ótimo em operações simples.

O benefício óbvio para isso, como pode estar relacionado a você, é que suas consultas são muito menos complexas e fáceis de ler - fáceis de gerenciar (não> 1600 colunas) e mais rápidas. Definitivamente uma vitória geral.

Espero que isto ajude :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.