2017-06-07 4 views
1

Ich habe die folgende einfache Abfrage mit 2 Tabellen Joins und einer WHERE Klausel.So erhöhen Sie die Leistung der einfachen T-SQL-Abfrage - mit langen Arbeitszeiten. Bitte....!

Ich habe bereits die Schlüsselfügefelder sowie das WHERE Klauselfeld indiziert.

Diese 2 Tabellen haben etwa 123 Millionen Zeilen, was ziemlich groß ist. Es dauert ungefähr 7/8 Stunden, um die vollständige Abfrage unten zu vervollständigen. Ich indizierte und nicht sicher, was anderes zu tun, da es so eine einfache Abfrage mit JOIN & WHERE Klauseln:

insert into dbo.IMS_CLAIMS(CLAIM_ID 
          ,DX_CLAIM_ID 
          ,SVC_SEQ_NBR 
          ,SVC_DT 
          ,ALLWD_AMT 
          ,BILL_AMT 
         ) 
select h.CLAIM_ID 
     ,h.DX_CLAIM_ID 
     ,s.SVC_SEQ_NBR 
     ,h.SVC_DT 
     ,s.ALLWD_AMT 
     ,s.BILL_AMT 
from [2016Q4_VITALS_EXPORT_HEADERS] as h 
    inner join [2016Q4_VITALS_EXPORT_SERVICE] as s 
     on h.claim_id = s.claim_id 
where cast(SVC_DT as date) >= '2015-10-01' 
     and cast(SVC_DT as date) <= '2016-11-30'; 

Geschätzten Ausführungsplan:

+1

Welche Indizes sind 2016Q4_VITALS_EXPORT_SERVICE? –

+0

Warum müssen Sie Felder als Datum umwandeln? Wie werden diese Daten gespeichert? –

+1

Versuchen Sie, den Tabellenscan zu vermeiden, indem Sie einen Index dafür erstellen. das spart viel I/O, weil dicke Pfeile = viele Reihen bedeuten. Diese RID-Suche kann mit einem gruppierten Index optimiert werden. https://blogs.msdn.microsoft.com/craigfr/2006/06/30/bookmark-lookup/ –

Antwort

2
WHERE cast(SVC_DT as date) >= '2015-10-01' And cast(SVC_DT as date) <= '2016-11-30' 

Wenn Sie SVC_DT gossen Wenn Sie ein Datum eingeben, erzwingen Sie, dass SQL Server jede Zeile liest, den Cast ausführt und dann den Vergleich mit "2015-10-01" durchführt. Dies schließt die Verwendung von Indizes für SVC_DT aus.

WHERE SVC_DT >= '2015=10-01' AND SVC_DT < '2016-12-01' 

Beachten Sie, dass wir das Enddatum von 11/30 bis 12/01 stoßen haben, und dass die < = geändert <

Die Logik ist das gleiche wie oben, aber jetzt SQL Server kann Verwende einen Index.

+0

Eigentlich, wenn SVC_DT ein Datetime ist, ist dies kein Problem. Die Besetzung/Konvertierung von Datum zu Datum ist tatsächlich SARGable. :) http://sqlblog.com/blogs/rob_farley/archive/2010/01/22/sargable-functions-in-sql-server.aspx –

+0

Eigentlich SVC_DT ist Varchar-Datentyp. Es sind rohe Kundendaten. Das ist der Grund für Casting. – Syed

+1

@Syed diese Lösung wird für Zeichenfolge Datentyp so gut wie Datum arbeiten –

0

Wenn Sie Indizes für die Tabelle haben: dbo.IMS_CLAIMS, löschen Sie sie alle.

Bulk einfügen auf einem Heap ist viel schneller, als auf einer Tabelle mit Indizes.

Verwandte Themen