Im OTN-Forum wurde dieser Tage die Frage gestellt, ob nach einem Index-Aufbau ein expliziter Neuaufbau von Statistiken erforderlich ist. In einem Kommentar erwähnte ein Diskussionsteilnehmer sein Standardverfahren des Aufrufs von ALTER INDEX ... COMPUTE STATISTICS nach dem Index-Aufbau. Nun hatte ich eine relativ klare Vorstellung von den Unterschieden bei der Statistikerstellung unter Verwendung des (veralteten) ANALYZE-Kommandos (für Tabellen) und dem (aktuellen) Aufruf von DBMS_STATS.GATHER_TABLE - aber keine Ahnung, wie die Statistiken aussehen, die durch ALTER INDEX ... COMPUTE STATISTICS erzeugt werden. Ein Test zeigt ein recht drastisches Ergebnis: offenbar leistet die COMPUTE STATISTICS-Option des ALTER INDEX-Kommandos in 11.2 rein gar nichts:
-- 11.2.0.1 -- drop test table drop table t; -- create test table create table t as select rownum id , mod(rownum, 10) col1 from dual connect by level <= 100000; -- delete a lot of rows create index t_idx on t(id); delete from t where col1 <= 5; commit; -- statistics after object creation and delete select index_name, num_rows, leaf_blocks, last_analyzed from user_indexes where index_name = 'T_IDX'; INDEX_NAME NUM_ROWS LEAF_BLOCKS LAST_ANALYZED ----------------------------- ---------- ----------- ------------------- T_IDX 100000 222 04.08.2014 19:59:22 -- table stats deleted exec dbms_stats.delete_table_stats(user, 't') select index_name, num_rows, leaf_blocks, last_analyzed from user_indexes where index_name = 'T_IDX'; INDEX_NAME NUM_ROWS LEAF_BLOCKS LAST_ANALYZED ----------------------------- ---------- ----------- ------------------- T_IDX -- alter index compute statistics; alter index t_idx compute statistics; select index_name, num_rows, leaf_blocks, last_analyzed from user_indexes where index_name = 'T_IDX'; INDEX_NAME NUM_ROWS LEAF_BLOCKS LAST_ANALYZED ----------------------------- ---------- ----------- ------------------- T_IDX -- dbms_stats exec dbms_stats.gather_table_stats(user, 't', cascade=>true) select index_name, num_rows, leaf_blocks, last_analyzed from user_indexes where index_name = 'T_IDX'; INDEX_NAME NUM_ROWS LEAF_BLOCKS LAST_ANALYZED ----------------------------- ---------- ----------- ------------------- T_IDX 40000 222 04.08.2014 19:59:24
Eine ganz so große Überraschung ist dieses Verhalten allerdings insofern nicht, als bereits die Dokumentation zu 10.2 erklärte:
COMPUTE STATISTICS Clause: This clause has been deprecated. Oracle Database now automatically collects statistics during index creation and rebuild. This clause is supported for backward compatibility and will not cause errors.
In der Dokumentation zu 11g erscheint die Klausel überhaupt nicht mehr.
Keine Kommentare:
Kommentar veröffentlichen