powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оракл 19.6 путает колонки при подсчете cardinality/cost
26 сообщений из 26, показаны все 2 страниц
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069350
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По крайней мере в некоторых случаях. Это видно в trace 10053 - там видно что статистика по колонкам сдвинута.
Из-за этого он выдает бредовую cardinality и cost.
Вероятно, дело в виртуальной колонке - cдвиг начинается с нее.

Скрипт чтобы воспроизвести проблему ( спасибо Dominic Brooks ):


Код: plsql
1.
2.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.6.0.0.0



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
drop table t1;

create table t1
(id            number not null
,version       number not null
,create_ts     timestamp not null
,modify_ts     timestamp
,status        varchar2(24) generated always as (NVL2("MODIFY_TS",'SUPERSEDED','LATEST'))
,id2           number not null
,yn            varchar2(1) not null
,business_date date not null);

insert into t1
(id, version, create_ts, id2, yn, business_date)
select rownum
,      1
,      systimestamp
,      rownum
,      case when mod(rownum,2) = 1 then 'Y' else 'N' end
,      trunc(sysdate,'MON') + mod(rownum,10)
from   dual
connect by level <= 1000;

exec dbms_stats.gather_table_stats(USER,'T1'); 

explain plan for
with x as
(select * from t1
 union all
 select * from t1)
select *
from x
where yn = 'Y';

select * from table(dbms_xplan.display); 

Plan hash value: 3505968351
 
------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |    42 |     6   (0)| 00:00:01 |
|   1 |  VIEW                       |      |  1000 | 40000 |     8   (0)| 00:00:01 |
|   2 |   UNION-ALL                 |      |       |       |            |          |
|*  3 |    TABLE ACCESS STORAGE FULL| T1   |   500 | 20000 |     4   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS STORAGE FULL| T1   |   500 | 20000 |     4   (0)| 00:00:01 |
------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - storage("T1"."YN"='Y')
       filter("T1"."YN"='Y')
   4 - storage("T1"."YN"='Y')
       filter("T1"."YN"='Y') 



Как видите - итоговая кардиналити получилась 1 вместо 1000. Кто-нибудь с таким сталкивался и знает как пофиксить?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069356
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valergrad
Код: plsql
1.
19.6

как пофиксить?
Банальный вопрос: 19.11 не пробовал?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069364
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

не пробовал. Это же не от меня зависит.
Но та же самая фигня сохраняется если сделать OPTIMIZER_FEATURES_ENABLE другие версии - 11g, 12c и т.п. вплоть до 9ки.
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069395
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

Что ж ни ты ни Дом Брукс (он в oracle-L написал об этом) не выложите сам трейс?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069404
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ok, повторяется и на 12.1.0.2 и на 19.9.
из 10053:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
# grep "Table Stats::" -A10 ORA19_ora_27526_vcol3.trc
Table Stats::
  Table:  X  Alias:  X  (NOT ANALYZED)
  #Rows: 2000  SSZ: 0  LGR: 0  #Blks:  10  AvgRowLen:  9.00  NEB: 0  ChainCnt:  0.00  ScanRate:  0.00  SPC: 0  RFL: 0  RNF: 0  CBK: 0  CHR: 0  KQDFLG: 1
  #IMCUs: 0  IMCRowCnt: 0  IMCJournalRowCnt: 0  #IMCBlocks: 0  IMCQuotient: 0.000000
  Column (#3): YN(VARCHAR2)  NO STATISTICS (using defaults)
    AvgLen: 1 NDV: 0 Nulls: 0 Density: 0.000000
  Column (#2): STATUS(NUMBER)
    AvgLen: 2 NDV: 2 Nulls: 0 Density: 0.500000
  Column (#1): ID(NUMBER)
    AvgLen: 4 NDV: 1000 Nulls: 0 Density: 0.001000 Min: 1.000000 Max: 1000.000000
try to generate single-table filter predicates from ORs for query block SEL$3 (#0)
--
Table Stats::
  Table: T1  Alias: T1
  #Rows: 1000  SSZ: 0  LGR: 0  #Blks:  5  AvgRowLen:  9.00  NEB: 0  ChainCnt:  0.00  ScanRate:  0.00  SPC: 0  RFL: 0  RNF: 0  CBK: 0  CHR: 0  KQDFLG: 1
  #IMCUs: 0  IMCRowCnt: 0  IMCJournalRowCnt: 0  #IMCBlocks: 0  IMCQuotient: 0.000000
  Column (#3): YN(VARCHAR2)
    AvgLen: 2 NDV: 2 Nulls: 0 Density: 0.500000
  Column (#1): ID(NUMBER)
    AvgLen: 4 NDV: 1000 Nulls: 0 Density: 0.001000 Min: 1.000000 Max: 1000.000000
try to generate single-table filter predicates from ORs for query block SEL$1 (#0)
finally: "T1"."YN"='Y'

--
Table Stats::
  Table: T1  Alias: T1
  #Rows: 1000  SSZ: 0  LGR: 0  #Blks:  5  AvgRowLen:  9.00  NEB: 0  ChainCnt:  0.00  ScanRate:  0.00  SPC: 0  RFL: 0  RNF: 0  CBK: 0  CHR: 0  KQDFLG: 1
  #IMCUs: 0  IMCRowCnt: 0  IMCJournalRowCnt: 0  #IMCBlocks: 0  IMCQuotient: 0.000000
  Column (#3): YN(VARCHAR2)
    AvgLen: 2 NDV: 2 Nulls: 0 Density: 0.500000
  Column (#1): ID(NUMBER)
    AvgLen: 4 NDV: 1000 Nulls: 0 Density: 0.001000 Min: 1.000000 Max: 1000.000000
try to generate single-table filter predicates from ORs for query block SEL$2 (#0)
finally: "T1"."YN"='Y'

...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069406
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
это было на более упрощенный тест:
vcol2.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
drop table t1;

create table t1
(id            number not null
,status        int generated always as (decode(yn,'Y',1,2))
,yn            varchar2(1) not null
);

insert into t1
(id, yn)
select rownum
,      case when mod(rownum,2) = 1 then 'Y' else 'N' end
from   dual
connect by level <= 1000;

exec dbms_stats.gather_table_stats(USER,'T1'); 

explain plan for
with x as
(select * from t1
 union all
 select * from t1)
select *
from x
where yn = 'Y';

select * from table(dbms_xplan.display); 

vcol3.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
set termout off;
alter session set statistics_level=all;
alter session set timed_statistics = true;
alter session set MAX_DUMP_FILE_SIZE = unlimited;
alter session set tracefile_identifier='vcol3';
alter session set events '10053';


with x as
(select * from t1
 union all
 select * from t1)
select *
from x
where yn = 'Y';

alter session set tracefile_identifier='new';
alter session set events '10053 off';
set termout on;
select * from table(dbms_xplan.display_cursor('','','allstats last')); 

...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069407
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
и на 11.2.0.4 повторяется:
test
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
drop table t1;

create table t1
(id            number not null
,status        int generated always as (decode(yn,'Y',1,2))
,yn            varchar2(1) not null
);

insert into t1
(id, yn)
select rownum
,      case when mod(rownum,2) = 1 then 'Y' else 'N' end
from   dual
connect by level <= 1000;

exec dbms_stats.gather_table_stats(USER,'T1'); 

explain plan for
with x as
(select * from t1
 union all
 select * from t1)
select *
from x
where yn = 'Y';

select * from table(dbms_xplan.display); 

План:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Plan hash value: 3505968351

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    20 |   160 |     4   (0)| 00:00:01 |
|   1 |  VIEW               |      |    20 |   160 |     4   (0)| 00:00:01 |
|   2 |   UNION-ALL         |      |       |       |            |          |
|*  3 |    TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("T1"."YN"='Y')
   4 - filter("T1"."YN"='Y')
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069411
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
По идее это Bug 23249829 - Incorrect cardinality estimate for join involving union all view (Doc ID 23249829.8)

Который по идее fixed в
18.1.0
12.2.0.1.180116 (Jan 2018) Database Release Update (DB RU)
12.2.0.1.180116 (Jan 2018) Bundle Patch for Windows Platform

но, видимо, как-то не до конца.
Замена UNION ALL на UNION решает проблему:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
explain plan for
with x as
(select 'union1' as v_union, t1.* from t1
 union
 select 'union2' as v_union, t1.* from t1)
select *
from x
where yn = 'Y';

select * from table(dbms_xplan.display); 


Plan hash value: 808093048

-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |  1000 | 36000 |     9  (34)| 00:00:01 |
|   1 |  VIEW                |      |  1000 | 36000 |     9  (34)| 00:00:01 |
|   2 |   SORT UNIQUE        |      |  1000 |  9000 |     9  (34)| 00:00:01 |
|   3 |    UNION-ALL         |      |       |       |            |          |
|*  4 |     TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
|*  5 |     TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("T1"."YN"='Y')
   5 - filter("T1"."YN"='Y')

18 rows selected.
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069415
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov,

спасибо!
в моем случае я UNION не могу использовать - у меня по миллиарду строк в каждой секции UNION ALL
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069422
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

ну я полагаю у вас таких запросов не так уж много, так прибейте профилем с cardinality(X 1000) или opt_estimate:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
explain plan for
with x as
(select * from t1
 union all
 select * from t1)
select/*+ cardinality(x 2000) */
*
from x
where yn = 'Y';

with x as
(select * from t1
 union all
 select * from t1)
select/*+ opt_estimate(TABLE X@SEL$3 ROWS=2000) */
*
from x
where yn = 'Y';
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069431
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
Valergrad,

ну я полагаю у вас таких запросов не так уж много



Да если бы! Фактически я добавил union all в ключевую факт вьюху в проекте. А BI-тул автоматически генерит запросы к ней - джойнит ее с дименшенами и т.п.
У него есть возможность добавить хинт - но только во все запросы сразу. Т.е. если добавлять хинт, то только во все запросы сразу. Я подумаю над этим если не найдется другого решения, но пока что выглядит нежелательно...
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069432
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069434
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Хах, нашел смешное решение:
Код: plsql
1.
2.
alter table t1 modify status invisible;
alter table t1 modify status visible;

test-case
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
drop table t1;
set echo on;

create table t1
(id            number not null
,status        int generated always as (decode(yn,'Y',1,2))
,yn            varchar2(1) not null
);

insert into t1
(id, yn)
select rownum
,      case when mod(rownum,2) = 1 then 'Y' else 'N' end
from   dual
connect by level <= 1000;

exec dbms_stats.gather_table_stats(USER,'T1'); 

explain plan for
with x as
(select t1.* from t1
 union all
 select t1.* from t1)
select *
from x
where yn = 'Y';

select * from table(dbms_xplan.display); 

alter table t1 modify status invisible;
alter table t1 modify status visible;

explain plan for
with x as
(select t1.* from t1
 union all
 select t1.* from t1)
select *
from x
where yn = 'Y';

select * from table(dbms_xplan.display); 

Results:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
SQL> explain plan for
  2  with x as
  3  (select t1.* from t1
  4   union all
  5   select t1.* from t1)
  6  select *
  7  from x
  8  where yn = 'Y';

Explained.

SQL>
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
Plan hash value: 3505968351

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    20 |   160 |     4   (0)| 00:00:01 |
|   1 |  VIEW               |      |  1000 |  9000 |     6   (0)| 00:00:01 |
|   2 |   UNION-ALL         |      |       |       |            |          |
|*  3 |    TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("T1"."YN"='Y')
   4 - filter("T1"."YN"='Y')

17 rows selected.

SQL>
SQL> alter table t1 modify status invisible;

Table altered.

SQL> alter table t1 modify status visible;

Table altered.

SQL>
SQL> explain plan for
  2  with x as
  3  (select t1.* from t1
  4   union all
  5   select t1.* from t1)
  6  select *
  7  from x
  8  where yn = 'Y';

Explained.

SQL>
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
Plan hash value: 3505968351

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |  1000 | 28000 |     6   (0)| 00:00:01 |
|   1 |  VIEW               |      |  1000 | 28000 |     6   (0)| 00:00:01 |
|   2 |   UNION-ALL         |      |       |       |            |          |
|*  3 |    TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS FULL| T1   |   500 |  4500 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("T1"."YN"='Y')
   4 - filter("T1"."YN"='Y')

17 rows selected.

...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069438
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Полный пример:
https://gist.github.com/xtender/e385961ed4ded3e5a9dda80520eeafb9


Из 10053 видно, что неправильно рассчитывает Rounded cardinality:
Код: plsql
1.
2.
3.
 kkecdn: Single Table Predicate:"X"."YN"='Y'
  Table: X  Alias: X
    Card: Original: 2000.000000  Rounded: 20  Computed: 20.000000  Non Adjusted: 20.000000
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069440
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

я надеюсь измененный порядок столбцов не сломает вам систему? на самом деле же, надеюсь, вы не используете * или хотя бы используете ее с динамическим определением столбцов для фетча?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069448
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
Valergrad,

я надеюсь измененный порядок столбцов не сломает вам систему? на самом деле же, надеюсь, вы не используете * или хотя бы используете ее с динамическим определением столбцов для фетча?


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

А что насчет звездочки? Чем она еще плоха?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069450
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

Tanel хорошо постарался свести все причины в один короткий пост: https://tanelpoder.com/posts/reasons-why-select-star-is-bad-for-sql-performance/
но насколько помню и я, и другие люди еще много добавляли в твиттере в ответах
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069467
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valergrad
в этой вьюхе и правда изначально была *.
Так показалось удобней - чтобы меньше менять при добавлении колонки.
Про 2033122 в курсе?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069973
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Саян за помощь и предложенное решение!

Доминик запостил пост об этом:

https://orastory.wordpress.com/2021/05/12/performance-issue-with-inline-view-union-all-and-virtual-column/

и мы создали SR для Оракла.

К сожалению, виртуальные колонки - это не единственная проблема с inline view с union all.
Даже пофиксив ее, Оракл продолжает шутить и выдавать бред в более сложных запросах.

Первое что пока уже понятно: это для верхней вьюхи используется статистика уровня таблицы ( т.е. не работает partition pruning ).
Т..е грубо говоря если у тебя есть
with x as ( select * from a
union all
select * from a )
select * from x where part_key = :p1;

То оракл для оценки кардиналити не берет инфу из статистики по партиции P1. ( Что он делает для каждого из внутренних блоков ).
Он берет статистику уровня таблицы. А так как ключ :p1 свежий, только что вставленный, то он получается больше чем high_value для этой колонки в статистике - и привет , опять кардиналити 1 из-за несоответствия диапазонов.

Но и это еще не все - похоже есть и другие проблемы. Расследование продолжается...
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069981
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума

Я видел, но тут не надо путать: перепутанная статистика столбцов и ошибочный расчет Rounded cardinality для UNION ALL views - разные вещи, разные проблемы. Для расчета ROUNDED CARDINALITY не используется статистика всех столбцов. Cardinality у вас рассчитался правильно, а Rounded cardinality - нет.
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40069988
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad
это для верхней вьюхи используется статистика уровня таблицы
кстати, я спомнил как я пользовался этим трюком для обхода запрета 22069948
не могу найти где в меня в твиттере это было...
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40070009
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov

Я видел, но тут не надо путать: перепутанная статистика столбцов и ошибочный расчет Rounded cardinality для UNION ALL views - разные вещи, разные проблемы. Для расчета ROUNDED CARDINALITY не используется статистика всех столбцов. Cardinality у вас рассчитался правильно, а Rounded cardinality - нет.


Боюсь я мало трейсов смотрел чтобы знать отличия между ними. Вот скажем, кусок из вашего трейса:


Код: plsql
1.
2.
3.
kkecdn: Single Table Predicate:"X"."YN"='Y'
  Table: X  Alias: X
    Card: Original: 2000.000000  Rounded: 20  Computed: 20.000000  Non Adjusted: 20.000000



У меня выглядит примерно так же. С чего я сделал вывод что
Original - это без учета предикатов.
Computed - c учетом предикатов.
Rounded - округленная Computed
Non Adjusted - хз, возможно это апдейты 0 в 1.

Не так?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40070013
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

в примере нет предикатов ни в 0 ни в 1-й строке. Да, в данном случае непосредственно поплывшая статистика столбцов приводит к проблеме, но вообще она не должна никак влиять, а должна просто суммироваться кардинальность дочерних row-sources
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40070014
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
как будет время, я еще поковыряю как и откуда она высчитывается именно для union all (перечисленные в письме в Oracle-L баги и их fix_control дают некоторые намеки)
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40070074
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valergrad

и мы создали SR для Оракла.


Можешь номер SRа дать?
...
Рейтинг: 0 / 0
Оракл 19.6 путает колонки при подсчете cardinality/cost
    #40070091
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Anokhin,

SR 3-25909385941
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оракл 19.6 путает колонки при подсчете cardinality/cost
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]