2017-01-03 3 views
1

Ich habe eine Abfrage, ich verwende eine innere Verknüpfung von 2 Tabellen, die etwa eine Million Zeilen haben. Ich versuche die Abfrage auszuführen, sodass nur Daten vom letzten Monat abgerufen werden. Es dauert jedoch sehr lange, wenn die Funktion getDate() verwendet wird. Aber wenn ich das Datum in diesem Format '2016-12-01' und '2017-01-01' gebe - ist es sehr schnell. Wie kann ich die Abfrage so ändern, dass sie schneller ausgeführt wird? Ich habe gelesen, dass ich vielleicht einen nicht geclusterten Index erstellen muss, aber ich bin noch nicht wirklich gut darin.So beschleunigen Sie SQL-Abfrage für Datum

select 
    custKey, 
    sum(salesAmt) as Sales, 
    sum(returnAmt) as Credit, 
    (sum(salesAmt) - sum(returnAmt)) as CONNET 
from 
    [SpotFireStaging].[dbo].[tsoSalesAnalysis] 
inner join 
    [SpotFireStaging].[dbo].OOGPLensDesc as o on tsoSalesAnalysis.ItemKey = O.ItemKey 
where 
    PostDate between --DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0) 
--AND DATEADD(MS, -3,DATEADD(MM, DATEDIFF(M,-1, GETDATE()) -1, 0)) 
    '2016-12-01' and '2017-01-01' 
group by 
    custkey 
+1

Wie lautet der Datentyp von 'PostDate' ?, gibt es Indizes in der Tabelle? – Lamak

+1

Ist es möglich, diese zwei Klammerdaten zu berechnen und sie vorher in zwei Variablen zu setzen? Was passiert wenn du es tust? Ich meine 'PostDate zwischen @firstDate UND @ secondDate'. – DVT

+0

Hallo, Ja, ich habe es versucht und es hat perfekt funktioniert. Ich kann nicht glauben, dass ich nicht darüber nachgedacht habe. Danke für die Hilfe! :) – Cesar

Antwort

4
declare @startDate DateTime = DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0) 
declare @endDate DateTime = DATEADD(MS, -3,DATEADD(MM, DATEDIFF(M,-1, GETDATE()) -1, 0)) 

select 
    custKey, 
    sum(salesAmt) as Sales, 
    sum(returnAmt) as Credit, 
    (sum(salesAmt) - sum(returnAmt)) as CONNET 
from 
    [SpotFireStaging].[dbo].[tsoSalesAnalysis] 
inner join 
    [SpotFireStaging].[dbo].OOGPLensDesc as o on tsoSalesAnalysis.ItemKey = O.ItemKey 
where 
    PostDate between @startDate AND @endDate 
group by 
    custkey 

weitere Alternative prüfen Zur Antwort aus:

When using GETDATE() in many places, is it better to use a variable?

GetDate() für jede Zeile separat berechnet wird, so wir müssen so ist DateDiff() und DateAdd() glauben. Es ist also besser, sie in eine lokale Variable zu verschieben.

Verwandte Themen