Ich versuche, eine ziemlich komplexe gespeicherte Prozedur zu debuggen, die über viele Tabellen (10-11) verbindet. Ich sehe, dass für einen Teil des Baumes die geschätzte Anzahl der Zeilen drastisch von der tatsächlichen Anzahl der Zeilen abweicht - im schlechtesten Fall schätzt der SQL Server, dass 1 Zeile zurückgegeben wird, wenn tatsächlich 55.000 Zeilen zurückgegeben werden!Wie berechnet SQL Server die geschätzte Anzahl der Zeilen?
Ich versuche herauszufinden, warum das ist - alle meine Statistiken sind auf dem neuesten Stand, und ich habe Statistiken mit einem FULLSCAN auf mehreren Tabellen aktualisiert. Ich verwende keine benutzerdefinierten Funktionen oder Tabellenvariablen. Soweit ich sehen kann, sollte SQL Server in der Lage sein, genau abzuschätzen, wie viele Zeilen zurückgegeben werden, aber es wählt weiterhin einen Plan aus, der Zehntausende von RDI-Abfragen durchführt (wenn erwartet wird, dass nur 1 ausgeführt wird) oder 2).
Was kann ich tun, um zu verstehen, warum die geschätzte Anzahl von Zeilen um so viel zu klein ist?
UPDATE: Also auf dem Plan suchen ich einen Knoten insbesondere gefunden haben, die suspicous scheint - es ist ein Tisch auf einem Tisch scannen Sie den folgenden predecate mit:
status <> 5
AND [type] = 1
OR [type] = 2
Dieses Prädikat die gesamte Tabelle zurück (630 Zeilen - die Tabelle scannt sich selbst nicht die Quelle der schlechten Leistung), aber SQL Server hat die geschätzte Anzahl der Zeilen bei nur 37. SQL Server fährt dann fort, mehrere verschachtelte Schleifen mit diesem auf RDI-Lookups, Index-Scans und Index zu tun sucht. Könnte dies die Ursache für meine massive Fehleinschätzung sein? Wie kann ich eine vernünftigere Anzahl von Zeilen schätzen?
Könnten Sie bitte Ihre Tabellendefinition und die vollständige Abfrage veröffentlichen? – Quassnoi
Sorry, aber nicht wirklich - es ist zu groß (250 Zeilen sp + 10 Tabellen). – Justin
Wenn Ihr Prädikat genau so ist (ohne Klammern), haben Sie möglicherweise ein logisches Problem. UND hat Vorrang vor ODER. Sollte [status] <> 5 AND sein (type = 1 OR type = 2) – GilaMonster