Domanda

Ciò che è più efficiente è gestire le istruzioni case in SQL o gestire gli stessi dati utilizzando le istruzioni if ​​nel codice.Lo chiedo perché il mio collega ha una query enorme che contiene molte dichiarazioni di casi.Le ho consigliato di alleviare lo stress dal DB codificando le dichiarazioni dei casi.Ho scoperto che è più efficiente...ma perché?

È stato utile?

Soluzione

C'è una domanda più fondamentale che non viene posta qui:Cosa sono questi CASE dichiarazioni effettivamente facendo?

Dimentica le prestazioni per un minuto.Se CASE viene utilizzato solo per trasformare l'output finale di una query ed è effettivamente possibile sostituire la stessa funzionalità con un file if O select case in ASP, probabilmente significa che la query/procedura del database sta tentando di eseguire operazioni di cui l'interfaccia utente dovrebbe essere responsabile, come la formattazione.Il problema della separazione degli interessi è più serio di qualsiasi possibile problema di performance.

Se hai una domanda come questa:

SELECT InvoiceID, InvoiceDate,
    CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...

Questo è semplicemente sciocco, perché l'interfaccia utente, o qualunque livello esegua la mappatura dei dati sul dominio, dovrebbe sapere come convertire uno stato nel database nella descrizione corrispondente.Non ha senso includere questa logica nella query stessa.

D'altra parte, se il CASE il costrutto è una parte essenziale della query, come:

SELECT
    SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
    SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
FROM ...

Non provare nemmeno a spostare questo tipo di logica nell'interfaccia utente, perché il database lo è tanto meglio farlo.E il CASE è semanticamente una parte della query ("calcola gli importi totali pagati e non pagati per X"), non assume il controllo di alcuna funzione dell'interfaccia utente.

Preoccupatevi innanzitutto di dove effettivamente appartiene la logica in base a ciò che intende realizzare.Le preoccupazioni relative alle prestazioni dovrebbero entrare nella discussione solo se stai effettivamente notando prestazioni significative i problemi.

Altri suggerimenti

CASE le dichiarazioni sono preferite perché:

  • SQL:Sono standard ANSI, rendendolo portabile su altri database senza necessità di modifiche
  • supportano il "cortocircuito"

Nella mia esperienza, i nostri server database sono MOLTO MOLTO più grandi dei nostri server applicazioni e di solito sono inattivi al di sotto del 30%.Chiedi al database di gestire i dati, quindi chiedi al client di scorrere il resultSet.È preferibile che il database restituisca solo i dati necessari (se è possibile determinarlo in anticipo).

Dovresti interrogare (filtrare e ordinare) i dati nel database e lasciare la presentazione al livello di presentazione.Ciò avviene per due ragioni fondamentali:

  • I database sono creati per filtrare e ordinare i dati
  • Si desidera estrarre la minima quantità di dati in rete dal DB, se necessario

Mentre leggo, qui la domanda di base è se CASE è migliore di IF in SQL.Le risposte dipendono anche dalla profondità delle tue condizioni.Ho trovato un buon articolo qui.Può essere utile a qualcuno.http://www.4guysfromrolla.com/webtech/102704-1.shtml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top