2015-05-27 10 views
5

Ho una colonna di data nella tabella di SQL Server denominata dd.Differenza nelle prestazioni in SQL

dd 
--------------------------- 
10-01-2015 00:00:00.000 
22-05-2015 10:22:32.521 
27-05-2015 12:30:48.310 
24-12-2014 09:51:11.728 
27-05-2015 02:05:40.775 
.... 

Ho bisogno di recuperare tutte le righe in cui il valore di dd è delle ultime 24 ore.

ho trovato 3 opzioni per il filtraggio per ottenere il risultato necessario:

1. `dd >= getdate() - 1` 
2. `dd >= dateadd(day, -1, getdate()) 
3. `dateadd(day, 1, dd) >= getdate() 

Le mie domande sono: Sono tutte le 3 opzioni recupererà tutte le righe di cui ho bisogno?
Se sì, qual è la differenza tra loro?

+6

# 3 è il peggiore che si possa fare! – JimmyB

+1

Hai esaminato i piani di esecuzione? –

+0

# 1 e # 2 sono identici, dove # 1 è solo la notazione abbreviata di MS-SQL per # 2. Userei il n. 2, perché sembra trasmettere più chiaramente al lettore quale unità viene aggiunta. – JimmyB

risposta

7
  1. dd >= getdate() - 1

Questo è qualcosa di simile a un hack, ma funziona, ma a volte può portare a errori (http://www.devx.com/dbzone/Article/34594/0/page/2).

  1. dd >= dateadd(day, -1, getdate())

Questo è il modo standard di fare le cose.

  1. dateadd(day, 1, dd) >= getdate()

Questo sarà anche funzionare, ma c'è un NO. Non userà l'indice se viene creato un indice su quella colonna. Perché non è un Search Argument (What makes a SQL statement sargable?). Quando si applica un'espressione a una colonna, questa non diventa SARG e non utilizzerà alcun indice.

Tutte e 3 la versione produrranno lo stesso risultato, ma prima è un hack e in alcuni casi porterà a un bug. Terzo non userà l'indice. Quindi è ovvio che si dovrebbe attenersi all'opzione 2.

4

I primi due sono esattamente come Giorgi ha detto, ma sul terzo il tuo Index Seek diventerà Index Scan. SQL Server continuerà a utilizzare tale indice ma non è più in grado di passare a un record specifico, ma deve eseguirne la scansione per trovare ciò di cui ha bisogno.

Ai fini della dimostrazione, ho selezionato la tabella con la colonna DATETIME indicizzata e ho selezionato solo quella colonna per evitare qualsiasi ricerca di chiavi e per mantenere semplice il piano.

enter image description here

anche dare un'occhiata alla legge sul tavolo e stimato vs conteggio delle righe restituito. Non appena si avvolge la colonna in una funzione, non è possibile stimare il numero corretto di righe che causerà grandi problemi di prestazioni quando le query diventano più complesse.

enter image description here