15 мая 2008 г.

DBMS_STATS или ANALYZE? (3)

Это продолжение темы "DBMS_STATS или ANALYZE?" Здесь я написала о том, почему Oracle рекомендует использовать dbms_stats вместо analyze, а здесь - о том, отличаются ли статистические данные собраные с помощью dbms_stats от данных, собранных с помощью analyze и если отличаются, то чем именно и кому из них верить.

Очередной вопрос: как определить, каким образом была собрана статистика? Пакетом dbms_stats или оператором analyze?

Столбец global_stats в представлениях dba_tables, dba_indexes, dba_tab_cols, dba_tab_columns, dba_tab_col_statistics определяет собрана глобальная статистика или нет.

Так как analyze не умеет собирать глобальную статистику (ее может собрать только dbms_stats), то можем сделать вывод, что если глобальная статистика собрана, то статистика была собрана с помощью dbms_stats, а если нет глобальной статистики - то статистика была собрана оператором analyze:

YES - собрана глобальная статистика, то есть статистика собрана с помощью dbms_stats
NO - статистика собрана с помощью аггрегирования статистики низлежащих партиций, субпартиций, то есть с помощью analyze

Вырезка из документации:

GLOBAL_STATS
For partitioned tables, indicates whether statistics were
collected for the table as a whole (YES) or were estimated from statistics on
underlying partitions and subpartitions (NO)
Подробней можно прочитать об этом на металинке Note: 236935.1.
SQL> analyze table emp compute statistics;
Table analyzed.

SQL> select table_name, partitioned, global_stats
2 from user_tables where table_name='EMP';
TABLE_NAME PARTITIONED GLOBAL_STATS
------------ ----------- ------------
EMP NO NO

SQL> exec dbms_stats.gather_table_stats(user, 'EMP', cascade=>true);
PL/SQL procedure successfully completed.

SQL> select table_name, partitioned, global_stats
2 from user_tables where table_name='EMP';
TABLE_NAME PARTITIONED GLOBAL_STATS
------------ ----------- ------------
EMP NO YES