Cómo hacer que las expresiones personalizadas repetidas en consultas SQL sean fáciles de mantener

Steven Yates

Imagina la siguiente consulta simple, donde obtengo una lista de todos los usuarios que fueron creados en los últimos 3 días, la lógica o el ejemplo no es importante

SELECT
    ...
    , DATEDIFF(DAY, U.DateCreated, GETUTCDATE())
    ...
FROM
    dbo.AspNetUsers U
WHERE
    DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3

He repetido un código DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3que, cuando tengo ejemplos mucho más complicados de lo anterior, no quiero mantener dos veces o cuantas veces necesite esa lógica.

¿Cómo se debe abordar esto teniendo en cuenta el rendimiento?

Gracias

Vladimir Baranov

Si tiene en mente el rendimiento, será mejor que repita las expresiones cuando sea necesario. Específicamente, no intente ponerlos en funciones definidas por el usuario. Se sabe que ralentizan las consultas en SQL Server.

Dicho esto, existen al menos dos métodos en SQL Server para hacer las consultas más legibles sin afectar el rendimiento:

  1. Redil
  2. APLICAR CRUZ

Ejemplo de uso de CTE:

WITH
CTE
AS
(

    SELECT
        ...
        , DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) AS CalculatedColumn
        ...
    FROM
        dbo.AspNetUsers U

)
SELECT
    ...
    CalculatedColumn
    ...
FROM CTE
WHERE
    CalculatedColumn < 3
;

Ejemplo de uso CROSS APPLY:

En lugar de repetir partes de la fórmula en la siguiente consulta:

SELECT
    ColA + ColB AS ColSum
    ,ColA - ColB AS ColDiff
    ,(ColA + ColB) * (ColA - ColB) AS Result
    ,(ColA + ColB) * (ColA - ColB) * 100.0 AS Percentage
FROM Table

Puede usar CROSS APPLYpara escribirlo así:

SELECT
    ColSum
    ,ColDiff
    ,Result
    ,Result * 100.0 AS Percentage
FROM
    Table
    CROSS APPLY
    (
        SELECT
            ColA + ColB AS ColSum
            ,ColA - ColB AS ColDiff
    ) AS A1
    CROSS APPLY
    (
        SELECT ColSum * ColDiff AS Result
    ) AS A2

Por cierto, hablando de rendimiento,

WHERE DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3

es terrible, porque no puede usar index on DateCreated(porque envolvió la columna en una función).

Será mejor que lo reescribas como algo como

WHERE U.DateCreated > DATEADD(DAY, -3, GETUTCDATE())

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Cómo podemos hacer que los scripts de cypress sean fáciles de mantener como POM en otras herramientas como selenium

¿Hay alguna forma de hacer que las consultas SQL sean más legibles en Java?

¿Cómo hacer que las expresiones regulares sean opcionales en una posición específica?

¿Cómo hacer que las expresiones sean computables en una directiva personalizada? (angularjs)

Cómo hacer que los filtros en las consultas sean opcionales

Cómo hacer parámetros en xpath y hacer que los códigos sean más fáciles de leer si hay varias líneas, java, selenio

¿Cómo hacer que las consultas de filtrado sean más eficientes usando flask sqlalchemy?

Cómo hacer que las pestañas sean desplazables en Flutter

¿Cómo puedo hacer que las propiedades en los archivos de propiedades sean obligatorias en Spring?

¿Cómo hacer que las entradas de la matriz sean claves en un registro en TypeScript?

¿Cómo hacer que las celdas de Excel sean obligatorias?

¿Cómo hacer que las columnas de arranque sean desplazables?

¿Cómo hacer que las columnas de arranque sean desplazables?

Con Spring Data REST, ¿cómo hacer que las consultas personalizadas utilicen el formato de salida de HATEOAS?

¿Cómo hacer que las imágenes en mapa de bits sean más pequeñas?

¿Cómo hacer que las columnas en el marco de datos sean únicas?

cómo hacer que todas las columnas sean visibles en el móvil de KTDatatable

¿Cómo hacer que las variables exportadas sean reactivas en un componente de Vue?

¿Cómo hacer que las propiedades opcionales sean necesarias en función de una condición?

¿Cómo configurar mis propiedades personalizadas para que sean las primeras en leerse desde el sistema de transmisión?

¿Cómo configurar mis propiedades personalizadas para que sean las primeras en leerse desde el sistema de transmisión?

¿Cómo hacer que las rutas personalizadas aparezcan en el mapa del sitio de Google?

¿Por qué el uso de "o" en las uniones SQL (Snowflake) hace que las consultas sean mucho más lentas?

¿Cómo hacer que las opciones (ancho = 60) sean persistentes en los fragmentos de código de R Markdown?

Haga que las diferencias con IntelliJ sean más fáciles de usar

Cómo hacer que las reclamaciones de usuario personalizadas estén disponibles en las solicitudes de API

¿Cómo hacer que las áreas proyectadas sean transparentes en el diagrama de área en ggplot2?

Cómo mantener el valor mínimo en una fila en varias columnas y hacer que todos los demás valores de fila sean 0 en R

¿Cómo hacer que las funciones virtuales de una superclase sean anulables para los nietos en C ++?

TOP Lista

CalienteEtiquetas

Archivo