Bearbeiten: +1 funktioniert in dieser Situation, da sich herausstellt, dass FILE_NUMBER
es sich um eine mit Nullen aufgefüllte Zeichenfolgenversion einer Ganzzahl handelt. Eine bessere Lösung für Zeichenfolgen ist das Anhängen ''
(der leere String), da das Anhängen eines Werts die Reihenfolge beeinflussen kann, oder das Hinzufügen einer Konstante, die jedoch eine nicht deterministische Funktion enthält, wie z sign(rand()+1)
. Die Idee, die Sorte zu durchbrechen, ist hier immer noch gültig, nur dass meine Methode nicht ideal war.
+1
Nein, ich meine nicht, dass ich mit irgendetwas einverstanden bin, ich meine das als Lösung. Wenn Sie Ihre Abfrage ändern , um ORDER BY cj.FILE_NUMBER + 1
dann das TOP 1
wird sich anders verhalten.
Wie Sie sehen, versucht das System mit dem kleinen Zeilenziel für eine geordnete Abfrage, die Daten der Reihe nach zu verarbeiten, um einen Sortieroperator zu vermeiden. Es wird auch vermieden, eine Hash-Tabelle zu erstellen, da es wahrscheinlich nicht zu viel Arbeit erfordert, um diese erste Zeile zu finden. In Ihrem Fall ist dies falsch - von der Dicke dieser Pfeile aus sieht es so aus, als müsste eine Menge Daten verbraucht werden, um eine einzelne Übereinstimmung zu finden.
Die Dicke dieser Pfeile deutet darauf hin, dass Ihre DOCUMENT_QUEUE
(DQ) -Tabelle viel kleiner als Ihre CORRESPONDENCE_JOURNAL
(CJ) -Tabelle ist. Und dass der beste Plan tatsächlich darin besteht, die DQ-Zeilen zu durchsuchen, bis eine CJ-Zeile gefunden wird. Genau das würde der Query Optimizer (QO) tun, wenn er nicht so nervig wäre. Dies ORDER BY
wird durch einen CJ-Covering-Index unterstützt.
Wenn Sie die Datei also ORDER BY
vollständig löschen, erhalten Sie wahrscheinlich einen Plan, der eine verschachtelte Schleife umfasst, die die Zeilen in DQ durchläuft und nach CJ sucht, um sicherzustellen, dass die Zeile vorhanden ist. Und mit TOP 1
würde dies aufhören, nachdem eine einzelne Reihe gezogen wurde.
Wenn Sie jedoch tatsächlich die erste Zeile in der richtigen FILE_NUMBER
Reihenfolge benötigen , können Sie das System dazu verleiten, den Index zu ignorieren, der (fälschlicherweise) so hilfreich zu sein scheint. ORDER BY CJ.FILE_NUMBER+1
Wir wissen, dass er die gleiche Reihenfolge wie zuvor, aber vor allem die QO beibehält nicht. Die Qualitätssicherung wird sich darauf konzentrieren, das Ganze darzulegen, damit ein Top-N-Sortieroperator zufrieden sein kann. Diese Methode sollte einen Plan erstellen, der einen Compute Scalar-Operator zum Ermitteln des Bestellwerts und einen Top N Sort-Operator zum Abrufen der ersten Zeile enthält. Aber auf der rechten Seite sollten Sie eine schöne verschachtelte Schleife sehen, die viele Suchvorgänge auf CJ ausführt. Und eine bessere Leistung als das Durchsuchen einer großen Zeilentabelle, die mit nichts in DQ übereinstimmt.
Das Hash-Match ist nicht unbedingt furchtbar, aber wenn die Menge der Zeilen, die Sie von DQ zurückgeben, viel kleiner als CJ ist (wie ich es erwarten würde), wird das Hash-Match viel mehr CJ scannen als es braucht.
Hinweis: Ich habe +1 anstelle von +0 verwendet, da das Abfrageoptimierungsprogramm wahrscheinlich erkennt, dass +0 nichts ändert. Natürlich könnte das Gleiche für die +1 gelten, wenn nicht jetzt, dann irgendwann in der Zukunft.
DOCUMENT_ID
Beziehung zwischen den beiden Tabellen erzwingt (oder hat jeder Datensatz inCORRESPONDENCE_JOURNAL
einen übereinstimmenden Datensatz inDOCUMENT_QUEUE
)?