Oracle 12c выпуск 1 Гистограммы для искаженных данных

Мы запускаем приложения Oracle 12.2.4 в базе данных 12.1.0.2.0. Когда я делаю следующий запрос:

select DBMS_STATS.GET_PREFS('AUTOSTATS_TARGET') as autostats_target,
       DBMS_STATS.GET_PREFS('CASCADE') as cascade,
       DBMS_STATS.GET_PREFS('DEGREE') as degree,
       DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT') as estimate_percent,
       DBMS_STATS.GET_PREFS('METHOD_OPT') as method_opt,
       DBMS_STATS.GET_PREFS('NO_INVALIDATE') as no_invalidate,
       DBMS_STATS.GET_PREFS('GRANULARITY') as granularity,
       DBMS_STATS.GET_PREFS('PUBLISH') as publish,
       DBMS_STATS.GET_PREFS('INCREMENTAL') as incremental,
       DBMS_STATS.GET_PREFS('STALE_PERCENT') as stale_percent
from   dual

Я получил:

"AUTOSTATS_TARGET","CASCADE","DEGREE","ESTIMATE_PERCENT","METHOD_OPT","NO_INVALIDATE","GRANULARITY","PUBLISH","INCREMENTAL","STALE_PERCENT"
"AUTO","DBMS_STATS.AUTO_CASCADE","NULL","DBMS_STATS.AUTO_SAMPLE_SIZE","FOR ALL COLUMNS SIZE AUTO","DBMS_STATS.AUTO_INVALIDATE","AUTO","TRUE","FALSE","10"

Однако, когда я бегу:

select distinct histogram
from   user_tab_col_statistics

Я получаю только NONE

Как возможно, что в экземпляре приложения Oracle не может быть таблиц с перекосами, для которых нужны гистограммы? Или я не понимаю настроек?

Также, если вам нужна гистограмма в столбце, вам нужно использовать method_opt => 'for all columns size skewonly'? Как вы можете указать auto для всех столбцов и skew для одного столбца?

Мне бы очень хотелось потенциального огромного увеличения скорости, которое могут принести гистограммы, и я удивлен, что приложения Oracle не обеспечивают этого по умолчанию. Существует процесс сбора статистики схемы, который запускается каждую ночь, может быть, код в нем очень старый и он убивает все вызовы dbms_stats? Я специально создал следующий индекс, который должен иметь гистограмму.

create index xxpqh_ss_trans_history_idx1 on hr.pqh_ss_transaction_history (process_name, nvl(selected_person_id, -1)) compress 1 tablespace apps_ts_tx_idx;

exec dbms_stats.gather_table_stats(ownname => 'HR', tabname => 'PQH_SS_TRANSACTION_HISTORY', cascade => true, method_opt => 'for all columns size skewonly');

person Superdooperhero    schedule 13.02.2018    source источник
comment
Моих знаний в hostigram немного, но при выполнении запроса к таблице с индексированным столбцом оптимизатор укажет свой метод. для получения дополнительной информации я действительно рекомендую прочитать этот пост из документа oracle docs.oracle .com/database/121/TGSQL/tgsql_histo.htm#TGSQL368   -  person Moudiz    schedule 13.02.2018


Ответы (1)


Приложения Oracle используют свои собственные механизмы для сбора статистики, и вам следует напрямую использовать dbms_stats.

"Статистика Oracle E-Business Suite должна собираться только с помощью FND_STATS или параллельного запроса Gather Statistics. Сбор статистики с помощью DBMS_STATS или команды ANALYZE, которая больше не поддерживается, может привести к неоптимальным планам выполнения для E-Business Suite"

Пожалуйста, обратитесь к следующему техническому документу для получения рекомендаций:

Рекомендации по сбору статистики с помощью Oracle E-Business Suite (примечание MOS 1586374.1)

person Connor McDonald    schedule 14.02.2018
comment
Как может не использование каких-либо гистограмм привести к оптимальным планам выполнения? - person Superdooperhero; 14.02.2018
comment
Я этого не говорил :-) Я сказал, что вам нужно использовать механизм, который является частью приложений, а не ваши собственные вызовы DBMS_STATS. - person Connor McDonald; 14.02.2018
comment
Документация немного запутанная. Должен ли я установить для параметра Gather Options в Gather Schema Statistics значение GATHER AUTO или GATHER? Именно эта часть управляет AUTO SAMPLE SIZE. - person Superdooperhero; 14.02.2018
comment
Кроме того, как включить мониторинг таблицы, который, по его словам, необходим для GATHER AUTO? - person Superdooperhero; 14.02.2018
comment
Мониторинг стола включается автоматически. Не нужно ничего запускать, чтобы активировать его. - person Connor McDonald; 15.02.2018
comment
Этот документ не помог. Когда я запускаю fnd_stats.gather_table_stats(ownname =› 'HR', tabname =› 'PQH_SS_TRANSACTION_HISTORY', cascade =› true --, method_opt =› 'для всех размеров столбцов с перекосом'); то нет возможности указать skewonly, но и без этого в user_tab_statistics ничего не выдается - person Superdooperhero; 15.02.2018
comment
И вы запустили LOAD_HISTOGRAM_COLS в соответствии с документом? Если да, и вы их не получили, то самое время позвонить в службу поддержки. - person Connor McDonald; 16.02.2018
comment
LOAD_HISTOGRAM_COLS исправил это. Однако, похоже, нет никаких указаний на то, используется ли он HYBRID или TOP-FREQUENCY. - person Superdooperhero; 20.02.2018
comment
проверьте USER_TAB_COLS.HISTOGRAM - person Connor McDonald; 22.02.2018
comment
USER_TAB_COLS не возвращает строк для table_name = 'PQH_SS_TRANSACTION_HISTORY' - person Superdooperhero; 22.02.2018
comment
Попробуйте ALL_TAB_COLS. USER = вещи, которыми вы владеете, ALL = вещи, к которым у вас есть доступ, DBA = много, CDB = ну, давайте не будем об этом. - person Connor McDonald; 25.02.2018
comment
Потрясающий! Спасибо! - person Superdooperhero; 27.02.2018