且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[20150706]11G cardinality feedback问题

更新时间:2022-09-13 11:03:08

[20150706]11G cardinality feedback问题.txt

--今天做一个测试例子,第1次遇到cardinality feedback的问题

1.建立测试环境:

SCOTT@test> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

create table t1 as select rownum id1, trunc(rownum/10)+1 id2,cast('t1test' as varchar2(20)) pad1 from xmltable('1 to 100000');
create table t2 as select lpad(rownum,10,'0') id1, cast('t2test' as varchar2(20)) pad2 from xmltable('1 to 100000');
create table t3 as select rownum id1, trunc(dbms_random.value(0,100)) x1,trunc(dbms_random.value(0,200)) x2,cast('t3test' as varchar2(20)) pad3 from xmltable('1 to 100000');
create table t4 as select * from t3 where 1=2;
--t4是空表,主要目的这样与生产系统信息符合.没有什么其它意思.
--另外T2表字段id1是字符型的,问题主要在这里。

create unique index pk_t1 on t1 (ID1);
alter table t1 add constraint pk_t1 primary key (id1);
create index i_t1_id2 on t1 (ID2);

create index pk_t2 on t2 (to_number(ID1));
create index i_t3_id1 on t3 (ID1);
create index i_t4_id1 on t4 (ID1);

--分析表忽略.Method_Opt => 'FOR ALL COLUMNS SIZE 1 '

create view v_t3t4  as select * from t3 union all select * from t4;

create or replace view v_tall as
select t1.id1,t1.id2,t1.pad1,t2.pad2,sum_x1,sum_x2
from t1,t2,
(select id1,sum(x1) sum_x1,sum(x2) sum_x2 from v_t3t4 group by id1) vx
where t1.id1=to_number(t2.id1) and t1.id1=vx.id1;

2.开始测试:

select * from v_tall where id2=42;

--执行计划如下:
SCOTT@test> @dpc '' outline
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  09qkq6x7ju4x2, child number 0
-------------------------------------
select * from v_tall where id2=42

Plan hash value: 431511531

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name     | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |          |        |       |    53 (100)|          |       |       |          |
|   1 |  HASH GROUP BY                  |          |     10 |   700 |    53   (2)| 00:00:01 |   766K|   766K| 1220K (0)|
|   2 |   NESTED LOOPS                  |          |     10 |   700 |    52   (0)| 00:00:01 |       |       |          |
|   3 |    NESTED LOOPS                 |          |     10 |   390 |    22   (0)| 00:00:01 |       |       |          |
|   4 |     TABLE ACCESS BY INDEX ROWID | T1       |     10 |   160 |     2   (0)| 00:00:01 |       |       |          |
|*  5 |      INDEX RANGE SCAN           | I_T1_ID2 |     10 |       |     1   (0)| 00:00:01 |       |       |          |
|   6 |     TABLE ACCESS BY INDEX ROWID | T2       |      1 |    23 |     2   (0)| 00:00:01 |       |       |          |
|*  7 |      INDEX RANGE SCAN           | PK_T2    |      1 |       |     1   (0)| 00:00:01 |       |       |          |
|   8 |    VIEW                         | V_T3T4   |      1 |    31 |     3   (0)| 00:00:01 |       |       |          |
|   9 |     UNION ALL PUSHED PREDICATE  |          |        |       |            |          |       |       |          |
|  10 |      TABLE ACCESS BY INDEX ROWID| T3       |      1 |    12 |     2   (0)| 00:00:01 |       |       |          |
|* 11 |       INDEX RANGE SCAN          | I_T3_ID1 |      1 |       |     1   (0)| 00:00:01 |       |       |          |
|  12 |      TABLE ACCESS BY INDEX ROWID| T4       |      1 |    39 |     1   (0)| 00:00:01 |       |       |          |
|* 13 |       INDEX RANGE SCAN          | I_T4_ID1 |      1 |       |     1   (0)| 00:00:01 |       |       |          |
------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$25E2CB83
   4 - SEL$25E2CB83 / T1@SEL$2
   5 - SEL$25E2CB83 / T1@SEL$2
   6 - SEL$25E2CB83 / T2@SEL$2
   7 - SEL$25E2CB83 / T2@SEL$2
   8 - SET$5715CE2E / V_T3T4@SEL$3
   9 - SET$5715CE2E
  10 - SEL$8E13D68A / T3@SEL$4
  11 - SEL$8E13D68A / T3@SEL$4
  12 - SEL$9384AC1D / T4@SEL$5
  13 - SEL$9384AC1D / T4@SEL$5

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
      DB_VERSION('11.2.0.3')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$8E13D68A")
      OUTLINE_LEAF(@"SEL$9384AC1D")
      OUTLINE_LEAF(@"SET$5715CE2E")
      PUSH_PRED(@"SEL$25E2CB83" "V_T3T4"@"SEL$3" 3)
      OUTLINE_LEAF(@"SEL$25E2CB83")
      MERGE(@"SEL$3")
      OUTLINE(@"SEL$4")
      OUTLINE(@"SEL$5")
      OUTLINE(@"SET$1")
      OUTLINE(@"SEL$25E2CB83")
      MERGE(@"SEL$3")
      OUTLINE(@"SEL$F5BB74E1")
      MERGE(@"SEL$2")
      OUTLINE(@"SEL$3")
      OUTLINE(@"SEL$1")
      OUTLINE(@"SEL$2")
      INDEX_RS_ASC(@"SEL$25E2CB83" "T1"@"SEL$2" ("T1"."ID2"))
      INDEX_RS_ASC(@"SEL$25E2CB83" "T2"@"SEL$2" "PK_T2")
      NO_ACCESS(@"SEL$25E2CB83" "V_T3T4"@"SEL$3")
      LEADING(@"SEL$25E2CB83" "T1"@"SEL$2" "T2"@"SEL$2" "V_T3T4"@"SEL$3")
      USE_NL(@"SEL$25E2CB83" "T2"@"SEL$2")
      USE_NL(@"SEL$25E2CB83" "V_T3T4"@"SEL$3")
      USE_HASH_AGGREGATION(@"SEL$25E2CB83")
      INDEX_RS_ASC(@"SEL$9384AC1D" "T4"@"SEL$5" ("T4"."ID1"))
      INDEX_RS_ASC(@"SEL$8E13D68A" "T3"@"SEL$4" ("T3"."ID1"))
      END_OUTLINE_DATA
  */

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

   5 - access("T1"."ID2"=42)
   7 - access("T1"."ID1"="T2"."SYS_NC00003$")
  11 - access("ID1"="T1"."ID1")
  13 - access("ID1"="T1"."ID1")
--存在一个谓词推入,很好的选择执行计划:
--PUSH_PRED(@"SEL$25E2CB83" "V_T3T4"@"SEL$3" 3)

3.而第2次执行:
SCOTT@test> @dpc '' outline
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  09qkq6x7ju4x2, child number 1
-------------------------------------
select * from v_tall where id2=42
Plan hash value: 3589297038
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name     | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  | Writes |  OMem |  1Mem | Used-Mem | Used-Tmp|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |          |      1 |        |       |   119 (100)|          |     10 |00:00:01.62 |     339 |    300 |    300 |       |       |          |         |
|*  1 |  HASH JOIN                    |          |      1 |     11 |   737 |   119   (2)| 00:00:01 |     10 |00:00:01.62 |     339 |    300 |    300 |   981K|   981K|  890K (0)|         |
|   2 |   NESTED LOOPS                |          |      1 |     10 |   280 |    22   (0)| 00:00:01 |     10 |00:00:00.01 |      12 |      0 |      0 |       |       |          |         |
|   3 |    TABLE ACCESS BY INDEX ROWID| T1       |      1 |     10 |   160 |     2   (0)| 00:00:01 |     10 |00:00:00.01 |       3 |      0 |      0 |       |       |          |         |
|*  4 |     INDEX RANGE SCAN          | I_T1_ID2 |      1 |     10 |       |     1   (0)| 00:00:01 |     10 |00:00:00.01 |       2 |      0 |      0 |       |       |          |         |
|   5 |    TABLE ACCESS BY INDEX ROWID| T2       |     10 |      1 |    12 |     2   (0)| 00:00:01 |     10 |00:00:00.01 |       9 |      0 |      0 |       |       |          |         |
|*  6 |     INDEX RANGE SCAN          | PK_T2    |     10 |      1 |       |     1   (0)| 00:00:01 |     10 |00:00:00.01 |       8 |      0 |      0 |       |       |          |         |
|   7 |   VIEW                        |          |      1 |     11 |   429 |    97   (3)| 00:00:01 |    100K|00:00:01.33 |     327 |    300 |    300 |       |       |          |         |
|   8 |    HASH GROUP BY              |          |      1 |     11 |   341 |    97   (3)| 00:00:01 |    100K|00:00:01.13 |     327 |    300 |    300 |  6485K|  2233K| 3353K (1)|    3072 |
|   9 |     VIEW                      | V_T3T4   |      1 |     11 |   341 |    96   (2)| 00:00:01 |    100K|00:00:00.70 |     327 |      0 |      0 |       |       |          |         |
|  10 |      UNION-ALL                |          |      1 |        |       |            |          |    100K|00:00:00.50 |     327 |      0 |      0 |       |       |          |         |
|  11 |       TABLE ACCESS FULL       | T3       |      1 |     10 |   120 |    94   (2)| 00:00:01 |    100K|00:00:00.10 |     327 |      0 |      0 |       |       |          |         |
|  12 |       TABLE ACCESS FULL       | T4       |      1 |      1 |    39 |     2   (0)| 00:00:01 |      0 |00:00:00.01 |       0 |      0 |      0 |       |       |          |         |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$F5BB74E1
   3 - SEL$F5BB74E1 / T1@SEL$2
   4 - SEL$F5BB74E1 / T1@SEL$2
   5 - SEL$F5BB74E1 / T2@SEL$2
   6 - SEL$F5BB74E1 / T2@SEL$2
   7 - SEL$3        / VX@SEL$2
   8 - SEL$3
   9 - SET$1        / V_T3T4@SEL$3
  10 - SET$1
  11 - SEL$4        / T3@SEL$4
  12 - SEL$5        / T4@SEL$5

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
      DB_VERSION('11.2.0.3')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$4")
      OUTLINE_LEAF(@"SEL$5")
      OUTLINE_LEAF(@"SET$1")
      OUTLINE_LEAF(@"SEL$3")
      OUTLINE_LEAF(@"SEL$F5BB74E1")
      MERGE(@"SEL$2")
      OUTLINE(@"SEL$1")
      OUTLINE(@"SEL$2")
      INDEX_RS_ASC(@"SEL$F5BB74E1" "T1"@"SEL$2" ("T1"."ID2"))
      INDEX_RS_ASC(@"SEL$F5BB74E1" "T2"@"SEL$2" "PK_T2")
      NO_ACCESS(@"SEL$F5BB74E1" "VX"@"SEL$2")
      LEADING(@"SEL$F5BB74E1" "T1"@"SEL$2" "T2"@"SEL$2" "VX"@"SEL$2")
      USE_NL(@"SEL$F5BB74E1" "T2"@"SEL$2")
      USE_HASH(@"SEL$F5BB74E1" "VX"@"SEL$2")
      NO_ACCESS(@"SEL$3" "V_T3T4"@"SEL$3")
      USE_HASH_AGGREGATION(@"SEL$3")
      FULL(@"SEL$5" "T4"@"SEL$5")
      FULL(@"SEL$4" "T3"@"SEL$4")
      END_OUTLINE_DATA
  */

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

   1 - access("T1"."ID1"="VX"."ID1")
   4 - access("T1"."ID2"=42)
   6 - access("T1"."ID1"="T2"."SYS_NC00003$")

Note
-----
   - cardinality feedback used for this statement

--不过这个问题我在一台11.2.0.4的机器测试,无法重现。估计是bug。