Una buona idea per spostare la logica dalle istruzioni SQL?

8

Presenterò questa domanda dicendo che sono molto nuovo nello sviluppo di software professionale.

Lavoro in un team che raccoglie dati da altri gruppi nella mia azienda e trasforma questi dati in rapporti utilizzabili dai dirigenti aziendali.

Nel processo di trasferimento e analisi dei dati abbiamo alcune istruzioni SQL che fanno un sacco di elaborazione dei dati. Quasi ogni SELECT utilizza estensivamente TRIM , SUBSTR , CAST ecc. Per ridurre i campi alla dimensione e al formato corretti. Inoltre ci sono molti casi speciali che vengono spiegati usando CASE istruzioni all'interno di SELECT .

Il software server Teradata che usiamo emette messaggi di errore notevolmente criptici. Di conseguenza facciamo un sacco di congetture su quali dati stanno infrangendo quale istruzione SQL.

La mia domanda è: sarebbe una buona idea ridurre queste istruzioni SQL piuttosto complesse in una forma meno complessa che omette l'elaborazione e la gestione dei casi speciali, e invece farlo in uno script esterno o programma? Ha senso?

    
posta Bryan Glazer 24.01.2013 - 19:30
fonte

4 risposte

12

Un grande vantaggio di spostare il codice di elaborazione dal tuo SQL è che il tuo SQL diventa molto più semplice da gestire.

Uno svantaggio è che se si desidera utilizzare tali query in qualche altro programma, è ora necessario rendere disponibili i processi di elaborazione dei risultati all'altro programma. Potrebbe essere semplice come copiare un file di libreria che contiene le classi necessarie, ma significa comunque che tutte le modifiche alla libreria devono essere propagate e tutti i client ricostruiti con la nuova libreria.

Un'altra opzione: perché non utilizzare una vista (o più viste se hai bisogno di risultati formattati in modo diverso per client diversi) per contenere la maggior parte del codice di formattazione? In questo modo puoi ottenere i risultati della query "grezzi" o quelli con una formattazione gradevole, a seconda di cosa ti serve.

    
risposta data 24.01.2013 - 19:46
fonte
6

Sono d'accordo con il suggerimento già fatto sull'utilizzo di una vista per questa logica. Vorrei solo aggiungere un'altra cosa sulle affermazioni Case. Tenere presente che estrarre le dichiarazioni del caso dall'SQL potrebbe comportare un impatto significativo sulle prestazioni del sistema. Queste affermazioni Case potrebbero ridurre significativamente la quantità di dati restituiti. L'esecuzione del filtro Case nel livello database tramite istruzioni SQL è in genere molto più efficiente rispetto al recupero di tutti i dati e al filtraggio in uno script o programma esterno. Se stai considerando questo, ti consiglio vivamente di eseguire alcune analisi dei dati e test delle prestazioni prima di procedere con quella soluzione.

    
risposta data 24.01.2013 - 20:47
fonte
4

L'aggiunta di un processo esterno di solito rende il sistema più difficile da eseguire il debug, ma in realtà dipende dalla situazione. Usa il tuo giudizio . Considera il tempo necessario per sviluppare / mantenere progetti fuori banda.

Stai già utilizzando un processo ETL ? Non ho esperienza con Teradata, ma separare i tuoi passaggi fornisce una visione molto più chiara di ciò che sta accadendo. Ecco una panoramica di 2 secondi:

  1. Estrai: estrai i tuoi dati dall'origine e inseriscili nella memoria temporanea di Stage 1. Non modificare il formato dei dati.
  2. Trasforma: tira dalla fase 1, e fai tutto il caso / assetto / substr / cast / formattazione ecc ... che hai bisogno qui. Inseriscilo nella memoria temporanea stage 2.
  3. Carica: estrai dalla fase 2 e inserisci tutti i dati nella memoria di destinazione.

Questo di solito fornisce informazioni sufficienti per gestire con successo questo tipo di sistema.

    
risposta data 24.01.2013 - 19:46
fonte
3

Sarei propenso a lasciare in posizione i bit CASE poiché questi sono correlati alla logica effettiva di produzione dei dati per somone / cosa da consumare. Quindi toglierli vuol dire che devi inviare un set di dati più grande e il client deve elaborarli su di esso - ora hai diviso il tuo rapporto "logico" su due livelli separati e questo non va bene.

Ma vorrei rilasciare come un mattone caldo qualsiasi formattazione dal tuo codice (a meno che non sia specificamente parte dei predicati JOIN, ecc.) perché la formattazione è il lavoro del consumatore ... quindi qualsiasi strumento di segnalazione che usano, sia Excel, Crystal , ecc., è bravo a formattare le cose nel locale corretto e tutto quel jazz. Lascia che il client faccia ciò che è buono (mostrando le cose con bei colori) e lascia che il server si concentri su ciò che sa fare meglio - scricchiolare i dati.

    
risposta data 24.01.2013 - 19:45
fonte

Leggi altre domande sui tag