Database Reference
In-Depth Information
7.1.1.3 Clustering Factor
Dieser Abschnitt ist der nächsten wichtigen Optimizer-Statistik „Clustering Factor“ (CF)
gewidmet, welche wir hier für B-Tree Indices betrachten. Diese Statistik ist wichtig für
Tabellenzugriffe über die ROWID bei einem Index Range Scan. Wenn Sie beobachten,
dass ein Index Range Scan relativ wenige Indexblockzugriffe macht, aber die zugehöri-
gen Tabellenzugriffe uber die ROWID hingegen sehr viele Tabellenblöcke lesen, würde ich
empfehlen, die Optimizer-Statistik CF des jeweiligen Indexes zu überprüfen.
Leonid: „ Peter, kennst Du diese Optimizer-Statistik?
Peter: „ Nein, die Bedeutung dieser Optimizer-Statistik ist mir nicht bekannt. Ich habe
irgendwelche nummerischen Werte von CF gesehen, sie sagen mir aber nichts.
L.: „ Diese Statistik ist für die Bemessung der Effektivität von Tabellenzugriffen bei Index-
Scans eingeführt. Sie zeigt, wie viele Tabellenblockzugriffe über die ROWID bei einem Full
Index Scan ausgeführt werden. Je höher der jeweilige Statistikwert ist, desto mehr wird auf die
Tabellenblöcke über ROWID auch bei Index Range Scans zugegriffen.
P.: „ Das Prinzip habe ich verstanden. Mir fehlen noch einige Details. Welche Werte kann
diese Statistik annehmen? Wie hoch können sie sein? Usw.
L.: „ Besprechen wir zunächst, wie Oracle diese Statistik berechnet. Oracle macht einen Full
Index Scan und prüft alle Indexsätze folgendermaßen: Wenn die jeweiligen Tabellensätze für
2 nacheinander folgende Indexsätze in verschiedenen Tabellenblöcken liegen, wird der CF um
1 erhöht (anfänglich ist CF = 1). Man kann das mit einem einfachen Select verifizieren (s. das
Skript test_case_clustering_factor.sql). Legen wir zunächst eine Tabelle und einen Index an
und erstellen für sie die Optimizer-Statistiken:
SQL> create table test1.t1 (a number, b number, c number, d number, e number, f number);
Table created.
SQL> insert into test1.t1 select mod(level,50), level*10, level*100, level*1000, level*10000,
level*100000 from dual connect by level <= 10000;
10000 rows created.
SQL> create index test1.i_t1 on test1.t1(a);
Index created.
SQL> exec dbms_stats.gather_table_stats('TEST1', 'T1')
PL/SQL procedure successfully completed.
SQL> select blocks from dba_tab_statistics where owner='TEST1' and table_name='T1';
BLOCKS
----------
43
SQL> select num_rows, clustering_factor from dba_ind_statistics where owner='TEST1' and
index_name='I_T1';
NUM_ROWS CLUSTERING_FACTOR
---------- -----------------
10000 2100
Search WWH ::




Custom Search