Database Reference
In-Depth Information
Statistiken bei einem leeren oder schlecht befüllten Tabellenzustand erstellt werden. Das kann
die Performanz beeinträchtigen, wenn diese Tabelle mit den Daten gefüllt ist. Was macht
man, um solche Situationen zu vermeiden, Peter?
P.: „ Man erstellt die Optimizer-Statistiken, wenn diese Tabelle mit den Daten gefüllt ist,
und blockiert danach die Statistikerstellung mit der Prozedur DBMS_STATS.LOCK_TAB-
LE_STATS.
L.: „ In einigen Situationen ist es aber nicht ausreichend, und man beobachtet weiterhin
schlechte Ausführungspläne. Aus welchem Grund?
P.: „ Hat es etwas mit Histogrammen zu tun?
L.: „ Es ist möglich, dass die jeweilige Tabelle eine Spalte hat, deren Werte kontinuierlich
ansteigen und aus diesem Grund außerhalb der ' eingefrorenen ' Histogramme landen. Wenn
diese Spalte in den Where-Klauseln benutzt wird, kann es sich negativ auf die Performanz der
jeweiligen SQL-Anweisungen auswirken. Solche Fälle hatte ich ein paar Mal in der Praxis.
Auch in diesen Fällen kann man versuchen, auf die jeweiligen Histogramme zu verzichten.
Peter, wie macht man das?
P.: „ Bei Oracle 10.2 gab es dafür den Parameter _ optimizer _ use _ histograms , der bei Ora-
cle 11 nicht mehr vorhanden ist.
L.: „ Dieser Parameter wirkte entweder system- oder sessionweit und konnte die anderen
SQL-Anweisungen negativ beeinflussen. Stattdessen sollte man lieber die Tabellenstatistiken
löschen ( das war die einzige Möglichkeit, die Histogramme bei Oracle 10g zu löschen ) und
danach das manuelle Erstellen der jeweiligen Tabellenstatistiken praktizieren und dabei kei-
ne Histogramme für die jeweilige Spalte generieren. Bei Oracle 11g kann man die Histo-
gramme mit der Prozedur DBMS_STATS.DELETE_COLUMN_STATS und dem Argument
COL_STAT_TYPE= >' HISTOGRAM ' löschen, ohne die restlichen Statistiken zu entfernen,
und danach das Argument METHOD_OPT in den Tabellenpräferenzen so festlegen, dass
keine Histogramme für die jeweilige Spalte nicht mehr entstehen. Zum Schluss dieses Ab-
schnitts möchte ich noch von einem Fall aus der Praxis erzählen, den ich mit dem Skript
test_case_char_histograms.sql nachgestellt habe.
SQL> create table t1 (a varchar2(200), b number, c number, d number, e number, f number);
Table created.
SQL> insert into t1 select '01234567890123456789012345678910'||to_char(level,'0000'), level,
level + 1, level + 2, level + 3, level + 4 from dual connect by level <= 1000;
1000 rows created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> create index i_t1 on t1(a);
Index created.
Search WWH ::




Custom Search