2010-03-11 8 views
7

Qué es más eficiente - manejo con sentencias case en sql o manejo de los mismos datos usando sentencias if en código. Lo estoy preguntando porque mi colega tiene una gran consulta que tiene muchas declaraciones de casos. Le aconsejé que quitara el estrés del DB codificando las declaraciones del caso. He descubierto que es más eficiente ... ¿pero por qué?Declaraciones de casos frente a sentencias if codificadas

+1

Esto es vago. Normalmente, las personas le aconsejarán que maneje las consultas de datos de DB en la base de datos, y recuerde que puede meterse en problemas tratando de mantener los patrones de db en el código (groups/unions/distincts) que es para lo que se hacen los dbs ... –

+2

Me parece que debes enfocarte más en esta pregunta en los desarrolladores DB, la etiqueta single sql no es suficiente, ¿qué sabor de la base de datos SQL estás usando? – AnthonyWJones

Respuesta

19

Hay una mayor Pregunta fundamental que no se está preguntando aquí: ¿Qué están haciendo realmente estas declaraciones CASE?

Olvida el rendimiento por un minuto. Si CASE solo se usa para transformar el resultado final de una consulta, y es posible reemplazar la misma funcionalidad con un if o select case en ASP, entonces probablemente signifique que la consulta/procedimiento de la base de datos intenta hacer cosas que la interfaz de usuario debería ser responsable, como el formateo. La cuestión de la separación de preocupaciones es más grave que cualquier posible problema de rendimiento.

Si tiene una consulta como esta:

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

Ésta es una tontería, ya que la interfaz de usuario, o lo que sea capa hace el mapeo de datos a dominio, debe saber cómo convertir un estado en la base de datos a su descripción correspondiente. No tiene sentido incluir esta lógica en la consulta en sí.

Por otro lado, si la construcción CASE es una parte esencial de la consulta, como:

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 ... 

Ni siquiera tratar de mover este tipo de lógica a la interfaz de usuario, ya que la base de datos es mucho mejor en eso. Y el CASE es semánticamente parte de la consulta ("cálculo total de las cantidades pagadas y no pagadas para x"), no está asumiendo ninguna función de IU.

Preocúpese primero de dónde pertenece la lógica en realidad en función de lo que se propone lograr. Las inquietudes sobre el rendimiento solo deben entrar en la discusión si observa un problema significativo problemas.

+0

¡Gran respuesta! ¡Muy útil! Exactamente lo que estaba buscando. – Eric

2

En mi experiencia, nuestros servidores de bases de datos son mucho MUCHO más grandes que nuestros servidores de aplicaciones y, por lo general, tienen menos del 30% de inactividad. Haga que la base de datos administre los datos, luego haga que el cliente repita el ResultSet. Es una buena práctica que la base de datos solo devuelva los datos que necesita (si puede determinar esto por adelantado).

5

CASE declaraciones son preferidos porque:

  • SQL: Son estándar ANSI, por lo que es portátil para otras bases de datos sin necesidad de alteración
  • apoyan "cortocircuito"
1

Usted debe consultar (filtrar y ordenar) los datos en la base de datos y dejar la presentación en el nivel de presentación. Esto es por dos razones fundamentales:

    se hacen
  • bases de datos para filtrar y ordenar los datos
  • desea extraer la menor cantidad de datos a través de cable de la base de datos según sea necesario
0

Como he leído, aquí la pregunta básica es si CASE es mejor que IF en SQL. Las respuestas también dependen de la profundidad de tus condiciones. Encontré un buen artículo aquí. Puede ser útil para alguien http://www.4guysfromrolla.com/webtech/102704-1.shtml

Cuestiones relacionadas