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()) < 3
que, 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
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:
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 APPLY
para 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
Déjame decir algunas palabras