Цитата:
Сообщение от
Андре
Не, создать не забыл, а вот в приведенный листинг не включил.
Это был оффтоп-юмор, именно что забыли включить в листинг, то что вы его реально создали и так понятно.
Цитата:
Сообщение от
Андре
При создании индекса статистика не создается даже на индекс. Ее надо собрать.
А вот тут вы не правы! Цитата из ссылки:
Цитата:
However, and here comes the trap, when a function-based index is created, Oracle will now (since 10g) automatically calculate the statistics associated with the index...
Проверка:
Код:
>sqlplus scott/tiger@zvvdb
SQL*Plus: Release 11.1.0.6.0 - Production on Sun Jan 11 12:20:42 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> set linesize 125
SQL> Drop Table Mytable
2 /
Table dropped.
SQL> Create Table Mytable(A Varchar2(30))
2 /
Table created.
SQL> Insert Into Mytable
2 Select Object_name
3 From All_objects
4 Where Rownum < 11
5 /
10 rows created.
SQL> Create Index Mytable_fbi On Mytable(Upper(A))
2 /
Index created.
SQL> Create Index Mytable_ni On Mytable(A)
2 /
Index created.
SQL> Select Table_name, Num_rows, Last_analyzed
2 From User_tables
3 Where Table_name = 'MYTABLE'
4 /
TABLE_NAME NUM_ROWS LAST_ANA
------------------------------ ---------- --------
MYTABLE
SQL> Select Table_name, Column_name, Num_distinct
2 From User_tab_cols
3 Where Table_name = 'MYTABLE'
4 /
TABLE_NAME COLUMN_NAME NUM_DISTINCT
------------------------------ ------------------------------ ------------
MYTABLE A
MYTABLE SYS_NC00002$
SQL> Select Table_name, index_name, distinct_keys, num_rows
2 From User_indexes
3 Where Table_name = 'MYTABLE'
4 /
TABLE_NAME INDEX_NAME DISTINCT_KEYS NUM_ROWS
------------------------------ ------------------------------ ------------- ----------
MYTABLE MYTABLE_NI 10 10
MYTABLE MYTABLE_FBI 10 10
SQL>
Так что, как видите, начиная с 10-ки статистика на индекс собирается автоматом, и именно об этом пишет автор в приведённой цитате. И именно в этом основной смысл статьи, что на индекс то статистика собралась, но надо не забыть и про hidden columns. До 10-ки действительно не собиралась статистика на индекс автоматом, если не указать
compute statistics, и проблемы, соответсвенно, такой не было.

При этом, в документации Оракла есть такая фраза:
Цитата:
After creating a function-based index, collect statistics on both the index and its base table using the DBMS_STATS package. Such statistics will enable Oracle Database to
correctly decide when to use the index.
А по поводу этого:
Цитата:
Сообщение от
Андре
Дык не в том вопрос. dbms_stats.gather_scheme_stats - стандартная периодическая операция выполняемая минимум раз в неделю. Почему именно scheme? Потому что мне лень все таблички перебирать
А если мы уже используем dbms_stats.gather_scheme_stats, то смысл в exec dbms_stats.gather_table_stats пропадает.
Да, это стандартная операция, но, возможно, вы захотите чтоб оптимизатор захотел использовать ваш новый индекс "по-максимуму" до того как запустится "развнедельная" операция. В этой ситуации вам dbms_stats.gather_table_stats очень даже поможет.
И не всё так однозначно с dbms_stats.gather_table/scheme_stats.
Начиная с 10-ки есть, конечно, джоб GATHER_STATS_JOB, который типа делает всё сам.
Но в 9-ке мне приходилось, например, делать сбор статистики по гораздо более сложной схеме, чем "dbms_stats.gather_scheme_stats раз в неделю", потому что на огромных объёмах схемы такая концепция становится крайне непродуктивной. Приходилось разделять как-то таблицы на группы и собирать статистику по частям, какие-то чаще, какие-то реже, ну и т.д.. В зависимости от структуры данных.
А лень таблички перебирать - это только до тех пор, пока полная статистика на схему не начинает день-другой пересобираться.