Oracle mechanics

10.12.2018

12.2: JPPD/OJPPD и параметр _OPTIMIZER_PUSH_PRED_COST_BASED

Filed under: 12.2,Oracle,Scripts — Игорь Усольцев @ 12:42
Tags:

До обновления 12.1 -> 12.2 запрос удовлетворительно (SLA, timeouts,…) быстро выполнялся по плану:

SQL_ID 4dgcbuug0z2mk
--------------------
  
Plan hash value: 1982197705
 
-----------------------------------------------------------------------------------------------------
| Id  | Operation                                          | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                   |        |       |     8 (100)|          |
|   1 |  VIEW                                              |      1 |  1258 |     8  (13)| 00:00:01 |
|   2 |   WINDOW SORT                                      |      1 |  1180 |     8  (13)| 00:00:01 |
|   3 |    SORT GROUP BY ROLLUP                            |      1 |  1180 |     8  (13)| 00:00:01 |
|   4 |     NESTED LOOPS                                   |      1 |  1180 |     7   (0)| 00:00:01 |
|   5 |      NESTED LOOPS                                  |      1 |  1180 |     7   (0)| 00:00:01 |
|   6 |       NESTED LOOPS                                 |      1 |  1171 |     6   (0)| 00:00:01 |
|   7 |        NESTED LOOPS                                |      1 |    24 |     5   (0)| 00:00:01 |
|   8 |         TABLE ACCESS BY INDEX ROWID                |      1 |    12 |     4   (0)| 00:00:01 |
|   9 |          INDEX UNIQUE SCAN                         |      1 |       |     3   (0)| 00:00:01 |
|  10 |         TABLE ACCESS BY INDEX ROWID BATCHED        |      1 |    12 |     1   (0)| 00:00:01 |
|  11 |          INDEX RANGE SCAN                          |      1 |       |     0   (0)|          |
|  12 |        VIEW                                        |      1 |  1147 |     1   (0)| 00:00:01 | -- **
|  13 |         UNION-ALL PARTITION                        |        |       |            |          | -- ***
|  14 |          NESTED LOOPS                              |      1 |   156 |    24   (0)| 00:00:01 |
|  15 |           NESTED LOOPS                             |      1 |   156 |    24   (0)| 00:00:01 |
|  16 |            NESTED LOOPS OUTER                      |      1 |   100 |    22   (0)| 00:00:01 |
|  17 |             NESTED LOOPS                           |      1 |    60 |    21   (0)| 00:00:01 |
|  18 |              TABLE ACCESS BY INDEX ROWID BATCHED   |      1 |    50 |    20   (0)| 00:00:01 | -- ****
|  19 |               INDEX RANGE SCAN                     |     17 |       |     4   (0)| 00:00:01 | -- ****
|  20 |              MAT_VIEW ACCESS BY INDEX ROWID BATCHED|      1 |    10 |     1   (0)| 00:00:01 | -- ****
|  21 |               INDEX RANGE SCAN                     |      1 |       |     0   (0)|          | -- ****
|  22 |             TABLE ACCESS BY INDEX ROWID            |      1 |    40 |     1   (0)| 00:00:01 | -- ****
|  23 |              INDEX UNIQUE SCAN                     |      1 |       |     0   (0)|          | -- ****
|  24 |            INDEX RANGE SCAN                        |      1 |       |     0   (0)|          | -- ****
|  25 |           TABLE ACCESS BY INDEX ROWID              |      1 |    56 |     2   (0)| 00:00:01 | -- ****
...
|  52 |       INDEX UNIQUE SCAN                            |      1 |       |     0   (0)|          |
|  53 |      TABLE ACCESS BY INDEX ROWID                   |      1 |     9 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------
Outline Data
-------------
 
  /*+
      BEGIN_OUTLINE_DATA
      OPTIMIZER_FEATURES_ENABLE('12.1.0.2')
      DB_VERSION('12.1.0.2')
...
      OLD_PUSH_PRED(@"SEL$641071AC" "MS"@"SEL$3" ("INVOICE"."CLIENT_ID")) -- *
...
      END_OUTLINE_DATA
  */

, с использованием OJPPD — Old-stype (non-cost-based) Join Predicate Push-Down (*) высокоизбирательного условия («INVOICE».»CLIENT_ID») в обзор (**) вида UNION-ALL PARTITION (***) с последующим быстрым индексным доступом (****)

В версии 12.2, похоже, что-то существенно изменилось, OJPPD в процессе компиляции плана перестал рассматриваться совсем, в то время как Cost-based JPPD, похоже, как и в 12.1 (возможно и раньше), отказывается работать с Union-All View под надуманным предлогом (*), меняя при этом устаревшую (?) операцию UNION-ALL PARTITION на UNION-ALL: (more…)

Реклама

17.08.2018

12.2 Materialized View Refresh Statistics Slowdown

Filed under: 12.2,Oracle — Игорь Усольцев @ 01:24
Tags: ,

Заметно замедлившайся рутинная операция обновления matview в версии Oracle 12.2 указывала, что выполняющая обновление сессия помимо необходимых и понятных операций DELETE+INSERT значительную часть времени проводила в дублирующих общую статистику DBMS_STATS подсчётах Cardinality всех подряд странного набора matview нашей базы: (more…)

01.06.2018

12.2: ORA-979 при разборе запросов с использованием WITH clause, PLSQL function и View Merging

Filed under: 12.2,bugs,Oracle — Игорь Усольцев @ 10:25
Tags: ,

Евгений Калинин обнаружил запрос, факт успешности выполнения которого неожиданно зависел от использования/неиспользования столбцов Inline view(*) а качестве параметров PLSQL_FUNCTION, и худшем случае завершавшийся простой ошибкой:

12.2.0.1.@ SQL> with s_q_by_month as
  2   (select contract_id,
...
 19     group by contract_id,
...
 30  s_q as
 31   (select plsql_function(sum_rub, -- вот этих столбцов *
 32                          max_amt,
...
 36      from (select contract_id,    -- вот этого Inline view
...
 43                   max(amt) as max_amt,
 44                   sum(amt_rub) as sum_rub,
...
 48              from s_q_by_month
 49             group by contract_id,
...
 56  select
 57   * from s_q
 58  /
 * from s_q
          *
ERROR at line 57:
ORA-00979: not a GROUP BY expression

, возникавшей на этапе построения плана, обрывая трассировку где-то в районе Query Transformation — в данном случае трейс заканчивался упоминанием OJE(Outer Join Elimination)

Соответствующая трассировка по номеру ошибки, почерпнутая из Bug 21799456 : ORA-979 ERROR GENERATED FROM A SELECT STATEMENT IN 12C: (more…)

21.05.2017

12c: Dynamic Sampling при индексном доступе к данным

Filed under: 12.2,Oracle — Игорь Усольцев @ 14:33
Tags: ,

В дополнение к старому описанию особенностей DS версии 10.2 — Dynamic Sampling при индексном доступе к данным — на том же тесткейсе наблюдал как измененилось поведение Old Style Dynamic Sampling (DS) и Adaptive Dynamic Sampling (ADS) в новых версиях Oracle 12c

Итак, тестовый DDL без изменений:

alter session set statistics_level=all;
alter system flush shared_pool;
drop table t1
/
create table t1
as
select * from all_objects
where rownum < 10001
/
create index t1_object_type on t1(object_type);
create index t1_created on t1(created);
alter table t1 add constraint t1_pk primary key (object_id);
exec dbms_stats.gather_table_stats(ownname => 'SCOTT',tabname => 'T1',method_opt => 'for all columns size 1', cascade => true); -- чтобы DS было чем заняться)
select distinct histogram from user_tab_col_statistics where table_name = 'T1';

1) Old Style Dynamic Sampling, версия 12.1 (more…)

14.11.2016

Скоро 12.2

Filed under: 12.2,Oracle — Игорь Усольцев @ 00:30
Tags:

На прошлой неделе появилась полная версия документации Oracle Database 12c Release 2

, следом Mike Dietrich публикует триптих:

New SPFILE parameters in Oracle Database 12.2.0.1
Obsolete SPFILE Parameters 12.2.0.1
Deprecated Parameters in Oracle Database 12.2.0.1

, и Российский Oracle, по слухам, в конце месяца готовит целенаправленный семинар с более подробным описанием/обсуждением новых опций «Oracle Database 12c Release 2»

— всё идёт к скорому релизу

Блог на WordPress.com.