Oracle - гистограммы столбцов, показывающие NONE даже после GATHER_TABLE_STATS - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь выполнить настройку производительности для запроса SQL в Oracle 12c, который использует оконный раздел. Для таблицы PIT создан индекс HUB_POL_KEY, PIT_EFF_START_DT. Выполняя план объяснения с помощью / * + collect_plan_statistics * / hint, я заметил, что в плане объяснения есть шаг сортировки окон, который имеет оценочное число строк 5000K и фактическое число строк 1100. Я выполнил DBMS_STATS.GATHER_TABLE_STATS на столе , Когда я проверил таблицу USER_TAB_COLUMNS, я увидел, что гистограмма для HUB_POL_KEY, PIT_EFF_START_DT не сгенерирована. Однако для всех остальных столбцов существует гистограмма.

SQL-запрос

SELECT 
PIT.HUB_POL_KEY,
NVL(LEAD(PIT.PIT_EFF_START_DT) OVER (PARTITION BY PIT.HUB_POL_KEY ORDER BY PIT.PIT_EFF_START_DT) ,TO_DATE('31.12.9999', 'DD.MM.YYYY')) EFF_END_DT
FROM PIT

1-я попытка:

EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT');

2-я попытка:

EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT', method_opt=>('FOR COLUMNS SIZE 254 (HUB_POL_KEY,PIT_EFF_START_DT)'));

Проверка гистограммы:

SELECT HISTOGRAM FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'PIT'
AND COLUMN_NAME IN ('HUB_POL_KEY','PIT_EFF_START_DT') --NONE

Таблица статистики:

SELECT COUNT(*) FROM PIT --5570253

SELECT COLUMN_NAME,NUM_DISTINCT,NUM_BUCKETS,HISTOGRAM FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'PIT'
AND COLUMN_NAME IN ('HUB_POL_KEY','PIT_EFF_START_DT')
+------------------+--------------+-------------+-----------+
|   COLUMN_NAME    | NUM_DISTINCT | NUM_BUCKETS | HISTOGRAM |
+------------------+--------------+-------------+-----------+
| HUB_POL_KEY      |      4703744 |           1 | NONE      |
| PIT_EFF_START_DT |       154416 |           1 | NONE      |
+------------------+--------------+-------------+-----------+

Что мне здесь не хватает? Почему размер корзины 1, даже когда я запускаю процедуру collect_table_stat с method_opt, указывающим размер?

1 Ответ

1 голос
/ 04 апреля 2019

Правильный синтаксис согласно документации Oracle должен быть method_opt=>('FOR COLUMNS (HUB_POL_KEY,PIT_EFF_START_DT) SIZE 254'). Попытка этого не создала статистику гистограммы как ожидалось (возможно ошибка ¯_ (ツ) _ / ¯).

С другой стороны, использование method_opt=>('FOR ALL COLUMNS SIZE 254') или method_opt=>('FOR COLUMNS <column_name> SIZE 254') работает нормально.

Возможно, тогда можно было бы обойти эту проблему, чтобы собрать статистику для столбцов отдельно:

EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT', method_opt=>('FOR COLUMNS HUB_POL_KEY SIZE 254'));
EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT', method_opt=>('FOR COLUMNS PIT_EFF_START_DT SIZE 254'));
...