2016-08-22 8 views
0

Ich habe die folgende Abfrage zu beenden,Select-Anweisung dauert zu lange

SELECT 1 
FROM orderdetail    -- table orderdetail has 1420703 rows 
WHERE orderdetailstatusid != 3 -- not cancelled 
AND 
navdate = '20161212'; 

Das Problem ist, dass es mehr als 130 Sekunden dauert, mit ~ 1.420.703 Zeilen, die seit seiner Abtastung eine große Tabelle auszuführen. Ich habe mich gefragt, ob es einen Weg gibt, es ein bisschen schneller zu machen.

Ich versuchte am Ende limit 1 zu tun, aber das half auch nicht.

Kann jemand bitte einen Vorschlag machen, wie man es verbessert?

Vielen Dank im Voraus.

+2

Haben Sie irgendwelche Indizes auf dem Tisch? Ergänzen Sie die Ausgabe von 'explain select ...' ' –

+0

Vielen Dank @juergend für die Beantwortung meiner Frage, ich habe Indizes auf der Tabelle, aber keinen Index mit orderdetailstatus oder navdate. Vielleicht ist es eine gute Idee, einen neuen Index hinzuzufügen. Vielen Dank!!! – Nia

Antwort

1

Und mein Beitrag hinzuzufügen:

Für die beste Leistung:

Zunächst sollten Sie Ihre 2 Spalten indiziert haben, wie durch macco

Zweitens/<> Betreiber != vorgeschlagen ist ein perf Killer, viel für den Motor intensiver als = Operator, und kann zu einem vollständigen Tabellenscan führen. Wenn Sie können, ist es immer besser, alle möglichen Werte aufzulisten, anstatt anders als Wert zu sagen. Es sieht so aus als wäre es hier der Fall. So können Sie Ihre Abfrage wie folgt umschreiben kann:

SELECT 1 
FROM orderdetail    -- table orderdetail has 1420703 rows 
WHERE orderdetailstatusid IN (1,2,4,5) -- everything but cancelled 
    AND navdate = '20161212'; 

der Annahme, dass Sie nur orderdetailstatusid Werte wie (1,2,3,4,5) haben kann, entsprechend ändern.

+0

Hallo Thomas, vielen Dank für deine Antwort auf meine Frage, in der Tat hat es sehr geholfen, ich habe 'WHERE orderdetailstatusid IN (1,4)' verwendet, und es war verdammt viel schneller als früher. Vielen Dank für Ihren Vorschlag. :) – Nia

2

Erstellen Indizes für die Tabelle wird es schneller machen.

CREATE INDEX index_name1 
ON table_name (navdate) 

CREATE INDEX index_name2 
ON table_name (orderdetailstatusid) 
+1

Fügen Sie zuerst 'navdate' und dann 'orderdetailstatusid' als Index hinzu und wenn es für Ihre Daten geeignet ist, können Sie den Dataype von 'navdate' in INT ändern, jetzt scheint es CHAR oder VARCHAR zu sein, weil der Vergleich der Zeichendaten langsamer als numerisch ist. – Susang

+0

Danke Jungs für die Beantwortung meiner Frage, ich werde versuchen, Index zu erstellen, um zu sehen, ob es schneller geht. Danke nochmal !!!!! :) – Nia

1

SELECT 1

VON Orderdetail mit (NOLOCK)

WHERE orderdetailstatusid = 3 - nicht

UND navdate = '20161212' abgesagt!;

+0

Mit (NOLOCK) Erlauben Sie die Abfrage schneller auszuführen Dann erwarten Sie, wie es nicht erlaubt, über die Tabelle zu sperren –

+0

Hallo Alfaiz, Vielen Dank für Ihren Vorschlag, ich werde es sicherlich versuchen. Ich hatte keine Ahnung von "NOLOCK" -Dingie. Danke :) – Nia