2016-07-30 15 views
0

Ich versuche, Leistung auf die unten Abfrage zu verbessern, die für etwa 3 Sekunden ausgeführt wird. Ich bin neu in der Ausführungsplananalyse und Indizierung in SQL.mssql Datum Feld Leistungsprobleme

Ich habe bereits Indizierung auf DateFrom und DateTo-Dateien (2 separate Index und ein kombinierter Index). Ich habe versucht, die Indexierung auf DateLiveActual zu erstellen, aber keiner dieser Indizes wird im Ausführungsplan angezeigt.

Können Sie mir bitte helfen, die Abfrage zu optimieren?

declare @today date = convert(date,GETUTCDATE()); 
DBCC DROPCLEANBUFFERS 

SELECT 
      S.LocationId 
      ,SBP.CurrencyId 
      ,SUM(CASE 
        WHEN S.ServiceStatusId = 1 THEN COALESCE (SBP.MRR, 0) 
        ELSE 0 
       END) AS ActiveMRR 
      ,MIN(S.DateLiveActual) AS MinServiceDateLiveActual 
     FROM dbo.service_Service AS S 
     INNER JOIN dbo.billing_ServiceBillingPeriod AS SBP ON SBP.ServiceId = S.Id 
     WHERE 
      SBP.DateFrom <= @today AND (SBP.DateTo >= @today OR SBP.DateTo IS NULL) 
     GROUP BY S.LocationId, SBP.CurrencyId 

enter image description here

Antwort

1

Ich denke, es Sie tun können, nicht viel. Wie Sie aus der Pfeilstärke in Ihrem Ausführungsplan schließen können, ist Ihre where-Klausel nicht sehr selektiv. Sie können versuchen, Anzahl von Bytes aus billing_ServiceBillingPeriod mit kleineren Indexbaum lesen zu reduzieren:

ist
CREATE INDEX IX_DateRange 
ON billing_ServiceBillingPeriod(DateFrom, DateTo) 
INCLUDE (CurrencyId,ServiceID,MRR) 

Es gibt nicht viel können Sie mit HASH tun beitreten, wenn es viele Zeilen (dicker Pfeil) sind. Zusammenführungsjoin ist schneller, benötigt aber geordnete Ergebnismengen (wenn Daten verwendet werden, werden Datensätze an Daten sortiert, service_Service.Id ist ungeordnet). Auch hier können Sie die Festplattennutzung nur reduzieren, indem Sie Hashtabellen aus kleineren Mengen erstellen.

+0

Die Indizierung verbessert die Perf um 1 Sek., Danke für die Eingabe .. Allerdings dauert die Min (DateLiveScheduled) 1 Sek. Können wir das trotzdem beschleunigen? Eigentlich ist es in der service_Service-Tabelle, also nimmt SQL standardmäßig PKs Index. – Raghav