¿Cómo hacer más rápido de esta declaración: “Entre paramDate startDate y NULL”?

StackOverflow https://stackoverflow.com/questions/847750

  •  21-08-2019
  •  | 
  •  

Pregunta

Esta consulta está tomando mucho tiempo cuando endDate es nulo (creo que su declaración sobre el caso, antes de la declaración caso fue rápido)

SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END) 

¿Qué debo usar, cuando endDate es nulo para hacerlo más rápido?

¿Fue útil?

Solución

Aquí está la consulta sin convertir o CASO:

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())

Para asegurarse de servidor SQL doens't evaluar getdate () para cada fila, se puede almacenar en caché, aunque estoy bastante seguro servidor SQL es lo suficientemente inteligente como por defecto:

declare @now datetime
set @now = getdate()

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,@now)

Publicar el plan de consulta podría ayudar a explicar por qué la consulta es lento:

SET SHOWPLAN_TEXT ON
go
SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END)

Otros consejos

Si se trata de rendimiento crítico, entonces tal vez simplemente no utilizar null para la fecha final abierto -. Utilizar el máximo soportado de fecha y hora en su lugar (probablemente un montón de 9s)

También me gustaría hacer la conversión por separado:

DECLARE @when datetime
SET @when = CONVERT(SMALLDATETIME,'21-05-2009',103) 

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

Hay todavía algo un poco diferente en el arriba y el original; si se puede explicar el intención de la GETDATE() cheque que podría ser capaz de poner en orden (es decir: fix) un poco

.

Como punto de partida, factorizar GETDATE () de manera que su llama sólo una vez, y usted debería ver una mejora en la velocidad.

La forma en que usted ha escrito que está solicitando GETDATE () para ser evaluado cada vez que enddate es nulo.

Desde GETDATE () es una no determinista funcionar la consulta no se puede optimizar y tenderá a bajo realizar.

Se puede probar con el se unen función:

select * 
from HastaKurumlari
where convert(smalldatetime, '21-05-2009', 103) 
    between startDate and coalesce(endDate, getdate());

La única manera de estar seguro es intentar alternativas y ver el plan de ejecución generado para cada consulta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top