В Oracle 12.1.2 неверное количество элементов в одинаковом предикате, хотя я собрал последние статистические данные таблицы - PullRequest
0 голосов
/ 09 ноября 2018

Следующий пример - уменьшенная версия запроса, который я пытаюсь настроить, поскольку я заметил, что неправильность плана возникает в этой конкретной операции.

select  count (*) from XVIEWMGR.XV_CASE_STAGES_DATA
where  stage_id = max_initial_or_reopen_id

enter image description here

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

    OWNER                TABLE_NAME                       NUM_ROWS LAST_ANALYZED      
-------------------- ------------------------------ ---------- -------------------
XVIEWMGR             XV_CASE_STAGES_DATA                314079 09-11-2018 14:29:01


    TABLE_NAME                     COLUMN_NAME                    LAST_ANAL SAMPLE_SIZE  NUM_NULLS NUM_DISTINCT    DENSITY
------------------------------ ------------------------------ --------- ----------- ---------- ------------ ----------
XV_CASE_STAGES_DATA            STAGE_ID                       09-NOV-18      314079          0       308733 .00000323904474
XV_CASE_STAGES_DATA            MAX_INITIAL_OR_REOPEN_ID       09-NOV-18      314079          0       308728 .0000032390972

Надеюсь, вы, ребята, можете помочь.

1 Ответ

0 голосов
/ 10 ноября 2018

Динамическая статистика (также известная как динамическая выборка) довольно хорошо справляется с заполнением таких пробелов.

Тестовая настройка:

create table xv_case_stages_data
( stage_id integer
, max_initial_or_reopen_id integer );

insert into xv_case_stages_data (stage_id, max_initial_or_reopen_id)
select rownum, rownum
from dual connect by rownum <= 1000;

commit;

call dbms_stats.gather_table_stats(user, 'XV_CASE_STAGES_DATA');

Проверка планов выполнения в 12.2 с использованием xplanx.sql (некоторые выходные данные удалены для удобства чтения):

SQL> select count (*) from xv_case_stages_data where stage_id = max_initial_or_reopen_id

SQL> @xplanx

Plan hash value: 1750917958

----------------------------------------------------------------------------------------------------
| Id  | Operation          | Name                | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                     |      1 |        |      1 |00:00:00.01 |       7 |
|   1 |  SORT AGGREGATE    |                     |      1 |      1 |      1 |00:00:00.01 |       7 |
|*  2 |   TABLE ACCESS FULL| XV_CASE_STAGES_DATA |      1 |      1 |   1000 |00:00:00.01 |       7 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("STAGE_ID"="MAX_INITIAL_OR_REOPEN_ID")

С динамической выборкой на уровне 4:

SQL> select /*+ dynamic_sampling(4) */ count (*) from xv_case_stages_data where stage_id = max_initial_or_reopen_id

SQL> @xplanx

Plan hash value: 1750917958

----------------------------------------------------------------------------------------------------
| Id  | Operation          | Name                | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                     |      1 |        |      1 |00:00:00.01 |       7 |
|   1 |  SORT AGGREGATE    |                     |      1 |      1 |      1 |00:00:00.01 |       7 |
|*  2 |   TABLE ACCESS FULL| XV_CASE_STAGES_DATA |      1 |   1000 |   1000 |00:00:00.01 |       7 |
----------------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("STAGE_ID"="MAX_INITIAL_OR_REOPEN_ID")

Note
-----
   - dynamic statistics used: dynamic sampling (level=4)
...