2010-03-11 16 views
7

Cosa è più efficiente: gestione con istruzioni case in sql o gestione degli stessi dati utilizzando istruzioni if ​​in codice. Sto chiedendo perché il mio collega ha una query enorme che ha molte dichiarazioni di un caso. Le ho consigliato di eliminare lo stress dal DB codificando le dichiarazioni del caso. Ho scoperto che è più efficiente ... ma perché?Case statement rispetto a istruzioni codificate if

+1

Questo è vago. In genere le persone consigliano di gestire le query di dati DB nel database e ricorda che si può incorrere in molti problemi nel tentativo di mantenere i modelli db nel codice (gruppi/unioni/distinti) che è ciò che viene creato per ... –

+2

Mi sembra che dovresti indirizzare questa domanda di più sugli sviluppatori DB, il singolo tag sql non è veramente sufficiente, che tipo di database SQL stai usando? – AnthonyWJones

risposta

19

C'è un altro domanda fondamentale che non viene posta qui: cosa stanno facendo queste affermazioni CASE?

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 uno if o select case in ASP, allora probabilmente significa che la query/procedura del database sta cercando di fare cose che l'interfaccia utente dovrebbe essere responsabile, come la formattazione. Il problema della separazione delle preoccupazioni è più grave di qualsiasi possibile problema di prestazioni.

Se si dispone di una query come questa:

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

Questo è solo stupido, perché l'interfaccia utente, o qualunque strato fa la mappatura dei dati a dominio, dovrebbe sapere come convertire uno stato nel database alla sua descrizione corrispondente. Non ha senso includere questa logica nella query stessa.

D'altra parte, se il costrutto CASE è 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 fanno così anche cercare di spostare questa logica gentile con l'interfaccia utente, perché il database è molto più meglio a questo. E lo CASE è semanticamente una parte della query ("calcolo totale degli importi pagati e non pagati per x"), non sta rilevando alcuna funzione dell'interfaccia utente.

Preoccupati prima di tutto di dove la logica appartiene effettivamente a ciò che intende realizzare. I problemi di rendimento dovrebbero entrare nella discussione solo se si notano effettivamente problemi significativi .

+0

Ottima risposta! Molto utile! Esattamente quello che stavo cercando. – Eric

2

In base alla mia esperienza, i nostri server di database sono molto più grandi dei nostri server di applicazioni e di solito sono al di sotto del 30% inattivo. Avere il database gestire i dati, quindi fare il iterate del client attraverso il resultSet. È meglio fare in modo che il database restituisca solo i dati necessari (se è possibile determinarlo in anticipo).

5

CASE dichiarazioni sono da preferire in quanto:

  • SQL: Sono standard ANSI, il che rende portabile su altre basi di dati, senza necessità di modifica della scheda
  • sostengono "corto circuito"
1

Si dovrebbe interrogare (filtrare e ordinare) i dati nel database e lasciare la presentazione al livello di presentazione. Questo per due motivi principali:

  • I database sono fatti per filtrare e ordinare i dati
  • si vuole tirare la minor quantità di dati sul filo dal DB, se necessario