2012-02-23 8 views
5

Quindi abbiamo una query semplice che viene eseguita con join su più tabelle e la data restringe questi dati. Queste query fanno parte del nostro carico di data warehouse e sono critiche nel tempo. Abbiamo notato una differenza enorme in entrambe le velocità di esecuzione e piani di esecuzione quando abbiamo cambiato di utilizzare le date in una clausola in cui entrare a far parte di una tabella temporanea con le date in modo da:.Parametri della data di gestione query SQL in modo diverso

Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime) 
    Declare @EndDate DateTime = GetDate() 

    Select * 
    From Table A 
      Inner Join Table B 
       On A.A = B.A 
    Where A.Date Between @StartDate AND @EndDate 

Una versione semplificata della query, ma restituisce 11k righe in circa 50 secondi.

Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime) 
    Declare @EndDate DateTime = GetDate() 

    Select @StartDate StartDate, @EndDate EndDate 
    Into #Dates 

    Select * 
    From Table A 
      Inner Join Table B 
       On A.A = B.A 
      Inner Join #Dates 
       On A.Date Between StartDate AND EndDate 

Restituisce le stesse righe di 11k ma sub second. Anche la differenza nel piano di esecuzione è notevole, la seconda query è piena di loop nidificati anziché di hash nella prima query.

La mia domanda è perché? Perché la 50 o seconda differenza?

/* * Modifica/

I due QEP del

1st Query with dates in Where

2nd Query with dates in join

+0

Questo non è destinato a essere paternalistico, mi dispiace, vale solo un controllo :) 'Quale tipo di dati è A.Data? E ha un indice? ' – MatBailie

+0

Its a Datetime, entrambi i campi nella clausola where sono tipi Datetime. E sì all'indice, DTA non ha suggerito alcun miglioramento per entrambe le query – Matt

+0

Puoi pubblicare entrambi i QP? –

risposta

0

Penso che sia questione di usare le funzioni nella clausola WHERE. Il problema descritto here

+0

Non penso che questo si applichi. Dove vengono utilizzate le funzioni nella clausola where degli esempi dell'OP? –

3

Penso che quello che stai incontrando è un problema di sniffing variabile (o la sua mancanza). Viene spiegato nei dettagli estremi here, ma in base a ciò, quando si utilizzano le variabili locali, SQL Server non prende in considerazione i propri valori durante la creazione del piano di query. Quando si utilizza una tabella temporanea lo è, e quindi sta generando un piano molto più performante.

A pochi modi per convalidare questo:

  • provare a girare queste variabili in parametri di query (o paremeters sProc)
  • Prova ad aggiungere OPTION (RECOMPILE) Come indicato in questo articolo.

La risposta alla domanda (perché la differenza degli anni '50) è puramente la differenza tra l'efficienza del buon QP rispetto al cattivo.

+0

Viene utilizzato come query diretta, pertanto non passiamo alcun parametro semplicemente impostando il valore del parametro. Lo stesso QP viene restituito quando si inseriscono i valori della data direttamente nella clausola where – Matt

+0

L'unica altra cosa che viene in mente è la statistica della tabella. Li hai aggiornati? Se non sono aggiornati potrebbero suggerire un altro piano. –

+1

Li ho controllati e aggiornati su tutte le tabelle referenziate e ancora gli stessi QP e tempi di esecuzione ...Comportamento davvero strano! – Matt

Problemi correlati