Kardinalität ist so weit von der Realität entfernt

7

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?

rfusca
quelle

Antworten:

9

Das erste, was ich tun würde, ist, die Statistiken für die Spalten einzeln mit diesen Abfragen zu überprüfen:

  • select count(*) from table1 where col1 = 123;
  • select count(*) from table1 where col2 = '1';

Wenn die geschätzten Kardinalitäten hier viel besser mit den tatsächlichen Zeilenzahlen übereinstimmen, bedeutet dies, dass eine gewisse Korrelation zwischen den Spalten besteht, die der CBO aufgrund der von einer Vanille erzeugten Histogramme nicht erraten kann gather_table_stats. Dynamisches Sampling sollte die Dinge auf Kosten einer längeren Analysezeit verbessern, ist aber keine Wunderwaffe.

Alternativ kann Oracle Database mit 11g auch Statistiken zu einer Gruppe von Spalten in einer Tabelle erfassen.

  1. Erstellen Sie eine Spaltengruppe
  2. Sammeln Sie Statistiken für eine Spaltengruppe
Jack sagt, versuchen Sie es mit topanswers.xyz
quelle