Domanda

Questa query sta prendendo molto tempo quando endDate è nullo (penso che la sua su istruzione case, prima di istruzione case che è veloce)

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

Cosa dovrei usare, quando endDate è nullo per renderlo più veloce?

È stato utile?

Soluzione

Ecco la query senza convertire o CASE:

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

Per assicurarsi Sql Server doens't valutare getdate () per ogni riga, si può memorizzare nella cache, anche se sono abbastanza sicuro Sql Server è abbastanza intelligente per impostazione predefinita:

declare @now datetime
set @now = getdate()

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

Distacco il piano di query potrebbe aiutare a spiegare il motivo per cui la query è 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)

Altri suggerimenti

Se si tratta prestazioni critiche, allora forse basta non usare null per la data finale aperto -. Utilizzare la massima supportata datetime invece (probabilmente un sacco di 9s)

Mi piacerebbe anche fare la conversione separatamente:

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

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

C'è ancora qualcosa di un po 'diverso in quanto sopra e l'originale; se si può spiegare il intento del GETDATE() controllare potrei essere in grado di riordinare (leggi: fix) un po '

.

Come punto di partenza, scomporre GETDATE () in modo che la sua chiamata solo una volta, e si dovrebbe vedere un miglioramento in termini di velocità.

Il modo in cui hai scritto che si sta chiedendo per GETDATE () per valutare ogni volta enddate è nullo.

Da GETDATE () è una non deterministico funzionare la query non può essere ottimizzato e tenderà a eseguire sotto.

Si potrebbe provare il fondono funzione:

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

L'unico modo per essere certi è cercare alternative e visualizzare il piano di esecuzione generato per ogni query.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top