Ich habe eine Tabelle, in der die Kardinalität für Pläne einfach zu hoch erscheint - trotz der Aktualisierung der Statistiken und sogar des Versuchs, dynamische Stichproben für Oracle 11gR2 zu erstellen.
select count(*)
from table1
where col1 = 123
and col2 = '1';
Die geschätzte Kardinalität für einen Wert von col1 beträgt ungefähr 29.000, wenn die tatsächlich zurückgegebenen Zeilen 637 betragen. Für einen anderen Wert beträgt die Plan-Kardinalität 460.000, wenn die tatsächlichen Zeilen 67.000 betragen. Im Allgemeinen führt dies dazu, dass es sehr schlechte Pläne wählt.
Ich habe versucht, Statistiken zu aktualisieren:
exec DBMS_STATS.gather_table_stats (ownname => 'ME', tabname =>'table1');
oder
exec DBMS_STATS.gather_table_stats (ownname => 'ME', tabname =>'table1',estimate_percent =>100);
Und ich habe verschiedene Werte von dynamic_samping (1-10) ausprobiert, aber nichts ändert es wesentlich:
select /*+ dynamic_sampling(t1 10) */ count(*)
from table1 t1
where col1 = 123
and col2 = '1';
dyanmic_sampling ändert sich, ist aber immer noch um den Faktor 50-100 ausgeschaltet.
Wie kann ich bessere Schätzungen erhalten?
quelle