Boa idéia para mover a lógica das instruções SQL?

8

Eu prefácio essa pergunta dizendo que sou muito novo no desenvolvimento de software profissional.

Eu trabalho em uma equipe que coleta dados de outros grupos da minha empresa e transforma esses dados em relatórios utilizáveis ​​por executivos de negócios.

No processo de transferência e análise de dados, temos algumas instruções SQL que processam muito os dados. Quase todos os SELECTusos TRIM, etc SUBSTR, são CASTextensivos para reduzir os campos ao tamanho e formato adequados. Além disso, há muitos casos especiais que são contabilizados usando CASEinstruções dentro de SELECT's.

O software do servidor Teradata que usamos emite mensagens de erro notavelmente enigmáticas. Como resultado, fazemos muitas adivinhações sobre quais dados estão quebrando qual instrução SQL.

Minha pergunta é: seria uma boa idéia reduzir essas instruções SQL um tanto complexas para uma forma menos complexa que omita o processamento e o tratamento especial de casos e, em vez disso, isso funciona em um script ou programa externo? Isto faz algum sentido?

Bryan Glazer
fonte

Respostas:

12

Uma grande vantagem de mover o código de processamento para fora do seu SQL é que ele se torna muito mais simples de gerenciar.

Uma desvantagem é que, se você quiser usar essas consultas em algum outro programa, agora precisará disponibilizar seus processos de processamento de resultados para outro programa. Pode ser tão simples quanto copiar um arquivo de biblioteca que contém as classes necessárias, mas ainda significa que quaisquer alterações na biblioteca precisam ser propagadas e todos os clientes reconstruídos com a nova biblioteca.

Outra opção: por que não usar uma visualização (ou várias visualizações, se você precisar de resultados formatados de maneira diferente para clientes diferentes) para conter a maior parte do código de formatação? Dessa forma, você pode obter os resultados da consulta "bruta" ou o bem formatado, dependendo do que você precisa.

FrustratedWithFormsDesigner
fonte
3
+1 por sugerir uma visualização que permitiria separar o SQL de formatação do SQL lógico.
2
+1 para uma visualização. Definitivamente a primeira solução que eu consideraria.
Matt S
6

Concordo com a sugestão já feita sobre o uso de uma View para essa lógica. Gostaria apenas de acrescentar mais uma coisa sobre as declarações Case. Esteja ciente de que retirar as instruções Case do SQL pode resultar em um impacto significativo no desempenho do sistema. Essas instruções de caso podem estar reduzindo significativamente a quantidade de dados retornados. Executar a filtragem de caso na camada de banco de dados por meio de instruções SQL é normalmente muito mais eficiente do que recuperar todos os dados e fazer a filtragem em um script ou programa externo. Se você está considerando isso, eu recomendo fazer algumas análises de dados e testes de desempenho antes de avançar com essa solução.

Shane
fonte
4

Adicionar um processo externo geralmente dificulta a depuração do sistema, mas isso realmente depende da situação. Use seu julgamento . Considere o tempo necessário para desenvolver / manter projetos fora da banda.

Você já está usando um processo ETL ? Não tenho experiência com o Teradata, mas separar suas etapas fornece uma visão muito mais clara do que está acontecendo. Aqui está uma visão geral de 2 segundos:

  1. Extrair: retire seus dados da fonte e coloque-os no armazenamento temporário do estágio 1. Não altere o formato dos dados.
  2. Transformação: Puxe do estágio 1 e faça todos os casos / trim / substr / cast / formatation etc ... que você precisa aqui. Coloque-o no armazenamento temporário do estágio 2.
  3. Carregar: Puxe do estágio 2 e coloque todos os dados no armazenamento de destino.

Isso geralmente fornece informações suficientes para gerenciar com êxito esse tipo de sistema.

Zachary Yates
fonte
2
Ahh sim, ETL é exatamente o que estamos fazendo. Exceto que parece ser algo mais parecido com ETTTLTLTL com a maioria das etapas de transformação feitas no SQL. Acho que meu objetivo é escrever as etapas de transformação em uma linguagem mais extensível, com melhor tratamento de erros do que o Teradata SQL, que é um desastre.
Bryan Glazer
3

Eu estaria inclinado a deixar os bits CASE no lugar, pois eles estão relacionados à lógica real de produzir os dados para que alguém / coisa consuma. Portanto, removê-los significa que você deve enviar um conjunto de dados maior de volta e o cliente precisa fazer algum processamento - agora você dividiu a "lógica" do relatório em duas camadas separadas e isso não é bom.

Mas eu gostaria de remover qualquer formatação do seu código (a menos que seja especificamente parte dos predicados JOIN, etc.) porque formatar é o trabalho do consumidor ... portanto, qualquer ferramenta de relatório que eles usem, seja Excel, Crystal, etc. é bom em formatar coisas no local correto e todo esse jazz. Deixe o cliente fazer o que é bom (mostrando as coisas com cores bonitas) e deixe o servidor se concentrar no que faz melhor - processar dados.

Stephen Byrne
fonte
Em alguns ambientes, o aplicativo que consome os dados também pode estar em execução no próprio servidor. Em seguida, torna-se a questão de onde é mais eficaz a formatação ou outras transformações. Em alguns casos, especialmente nos casos em que os valores se repetem com frequência, pode ser mais eficiente, em geral, permitir que o servidor use uma função determinística uma vez para cada valor encontrado e simplesmente use os resultados em cache nas ocorrências subsequentes desses valores. Por que vários aplicativos calculam a mesma transformação quando o servidor pode fazer isso uma vez por todos?
warrent
@ WarrenT, esse é um ponto justo, MAS se essas funções são determinísticas, por que se preocupar com o cache, apenas calcule e armazene conforme os dados são criados nas tabelas? uma má idéia para ter em seu banco de dados - você está assumindo que todos esses aplicativos desejam que os dados exibidos para seus usuários estejam no mesmo formato. O que significa que, por exemplo, todos em seu escritório no exterior precisam ver as datas dos relatórios em dd / mm / aaaa, apenas porque o banco de dados está localizado em inglês britânico. Certamente você pode concordar que isso é loucura?
Stephen Byrne