2016-11-17 5 views
0

Ich führe eine Abfrage, um einige Zahlen zu zählen und es scheint super langsam zu laufen. Dies ist auf einem MSSQL-Server. Es dauert ungefähr 22 Sekunden, um die Abfrage mit nur 34 zurückgegebenen Datensätzen auszuführen. Das Problem ist, dass ich mehrere SUMs zur gleichen Zeit laufen lasse und die Ausführungszeit summiert sich. Ich habe die SQL-Anweisung hier auf die Barebones von dem, was ich brauche, vereinfacht. Wie laufe ich das schneller?mit SUM mit einem Bereich, verschachtelte SQL, läuft langsam

SELECT 

    SUM(case when (claims.dateon >= '20161110' AND claims.dateon < '20161117') AND entries.errorCode NOT IN('DP','RB','WP','PE','OV') then entries.refundDue else 0.0 end) as rate1 

FROM auditors 

INNER JOIN claims 
    ON claims.auditorID = auditors.auditorID 
    AND claims.status='closed' 
--AND (claims.dateon >= '20161020' AND claims.dateon < '20161117') 
INNER JOIN entries 
    ON claims.rID = entries.rid 
WHERE claims.status = 'closed' 
    AND (claims.dateon >= '20161020' AND claims.dateon < '20161117') 

GROUP BY auditors.auditorID 
+0

Leistungsfragen sollten "EXPLAIN ANALYSE" und einige Informationen über Tabellengröße, Index, aktuelle Zeitleistung, Wunschzeit usw. enthalten. "Langsam" ist ein relativer Begriff und wir brauchen einen echten Vergleichswert. –

+0

Ich bin nicht zu sehr mit SQL Erfahrung, so erklären, dass dies das erste ist, das ich davon höre. Sorry über die langsamen, aber 22 Sekunden. Ich gehe davon aus, dass der zurückgegebene Betrag <1 Sekunde sein sollte. – Damien

+0

check [hier] (http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan) auch eine Beschreibung Ihrer Tabellen und wie viele Zeilen haben, und was Sie indiziert werden –

Antwort

0

Ich würde schreiben diese Abfrage mehr wie folgt aus:

SELECT auditor_id, 
     sum(case when c.dateon >= '20161110' AND c.dateon < '20161117' AND 
        e.errorCode NOT IN ('DP', 'RB', 'WP', 'PE', 'OV') 
       then e.refundDue else 0.0 
      end) as rate1 
FROM auditors a INNER JOIN 
    claims c 
    ON c.auditorID = a.auditorID AND c.status ='closed' INNER JOIN 
    entries e 
    ON c.rID = e.rid 
WHERE c.status = 'closed' AND (c.dateon >= '20161020' AND c.dateon < '20161117') 
GROUP BY a.auditorID; 

Dann würde ich feststellen, dass die zu Rechnungsprüfer kommen ist nicht notwendig:

SELECT auditor_id, 
     sum(case when c.dateon >= '20161110' AND c.dateon < '20161117' AND 
        e.errorCode NOT IN ('DP', 'RB', 'WP', 'PE', 'OV') 
       then e.refundDue else 0.0 
      end) as rate1 
FROM claims c INNER JOIN 
    entries e 
    ON c.rID = e.rid 
WHERE c.status = 'closed' AND 
     (c.dateon >= '20161020' AND c.dateon < '20161117') 
GROUP BY c.auditorID; 

Dann würde ich Indizes vorschlagen: claims(status, dateon, rId, auditorId) und entries(rid, error_code, refunddue).

+0

Sorry, aber ich brach die SQL-Anweisung auf die erforderlichen Komponenten. Auditoren sind notwendig. Nicht sicher, was Sie mit Indizes meinen – Damien

+0

'Nicht sicher, was Sie mit Indizes meinen', das klingt nicht gut. Und Index ist wie das Indexbuch eine Möglichkeit, schneller dorthin zu springen, wo Sie hin müssen. Reduzieren Sie die Abfragezeit um eine Menge. Überprüfen Sie [** hier **] (http://www.w3schools.com/sql/sql_create_index.asp) –

+1

Danke .... ich werde lernen über Indizes scheint es. – Damien