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
Questo non è destinato a essere paternalistico, mi dispiace, vale solo un controllo :) 'Quale tipo di dati è A.Data? E ha un indice? ' – MatBailie
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
Puoi pubblicare entrambi i QP? –