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
risposta
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 .
Ottima risposta! Molto utile! Esattamente quello che stavo cercando. – Eric
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).
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"
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
Come ho letto, qui la domanda di base è se CASE è meglio di IF in SQL. Le risposte dipendono anche dalla profondità delle tue condizioni. Trovato un buon articolo qui. Può essere utile a qualcuno. http://www.4guysfromrolla.com/webtech/102704-1.shtml
- 1. Unilateralmente se le istruzioni, come convertire questo if-else-statement
- 2. SQL - CASE STATEMENT - WHEN statement AND statement
- 3. DB2 CASE Statement
- 4. Jinja2 If Statement
- 5. if-statement sempre uguale a TRUE
- 6. Case Statement on INNER Join
- 7. If statement within Where clausola
- 8. if statement intero
- 9. If statement in C++
- 10. DBNull if statement
- 11. IF statement non funziona
- 12. Mysql CASE statement multiple columns
- 13. Funzione database VS Case Statement
- 14. 'if' istruzioni
- 15. python if elif else statement
- 16. django template if or statement
- 17. Rails RABL if else statement
- 18. Abbreviazione php if/or statement
- 19. SQL CASE rispetto all'efficienza JOIN
- 20. if-else-if rispetto mappa
- 21. mysql - if value = 0 shorten where statement
- 22. Alternativa a un milione di istruzioni IF
- 23. SQL CASE STATEMENT in COUNT CLAUSE
- 24. Perché diversamente si comportano in modo diverso nelle istruzioni for/while rispetto alle istruzioni if / try?
- 25. Case statement con condizionale nel server SQL
- 26. PHP - Istruzioni IF annidate
- 27. Multithreading Bash If Istruzioni
- 28. WHERE CASE WHEN statement with Exists
- 29. Istruzioni switch/case in C++
- 30. Assistente "if statement" condizionale per Handlebars.js
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 ... –
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