Bo's Oracle Station

【博客文章2023】 In-Memory Column Store系列3

2023-3-18 09:36| 发布者: admin| 查看: 1121| 评论: 0|原作者: Bo Tang

摘要: In-Memory Column Store系列3。
【博客文章2023】 In-Memory Column Store系列3


Author:Bo Tang

1. 实验环境:

    根据https://botangdb.com/mytec/mytec_sqltuning/202204/00900086.html,导入apps方案。导入apps方案后,请删除 plan_table:

SQL> conn apps/apps@c01orcl
Connected.
SQL> drop table plan_table;

   将apps方案中所有的表都改成inmemory:

begin
 for rec in (select  table_name from dba_tables where owner='APPS')
 loop
  execute immediate 'alter table apps.'||rec.table_name||' inmemory';
 end loop;
end;
/

    查看apps表的inmemory的详情:

select  table_name , inmemory, inmemory_compression, inmemory_distribute, inmemory_duplicate, inmemory_priority from dba_tables where owner='APPS';
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LU_PERIOD_293 ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
LU_PG_FEATUREVALUE_15_Q2 ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
ADM_PG_FEATUREVALUE ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
LU_ELEMENTGROUP_REL ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
FACT_PD_OUT_ITM_293 ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
LU_ELEMENTRANGE_REL_Q2 ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
STS_JFV_TAB ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
ADM_CC_FEATUREVALUE ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
LU_ITEM_293 ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
LU_ELEMENTRANGE_REL ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH
LU_OUTLET_293 ENABLED FOR CAPACITY HIGH AUTO NO DUPLICATE HIGH

2. 表连接和组函数中的In-Memory:

    apps用户执行下面这条查询语句,该语句既包含表连接又包含组函数和多条谓词:

SQL> SELECT /* ORDERED INDEX(t1) USE_HASH(t1) */
    'B' || t2.pg_featurevalue_13_id pg_featurevalue_13_id,
    'B' || t2.pg_featurevalue_02_id pg_featurevalue_02_id,
    'r' || t4.elementrange_id pg_featurevalue_15_id,
    'B' || t2.pg_featurevalue_08_id pg_featurevalue_08_id,
    'B' || t2.pg_featurevalue_01_id pg_featurevalue_01_id,
    'r' || t5.elementrange_id price_eur_id,
    'B' || t2.productgroup_id productgroup_id,
    'G' || t6.elementgroup_id period_id,
    SUM(t1.pd_sales_units*t1.pd_projection_factor*t1.pd_price_units_eur) salesvalueeur
FROM
    lu_item_293 t2,
    lu_pg_featurevalue_15 t3,
    lu_elementrange_rel t4,
    fact_pd_out_itm_293 t1,
    lu_elementgroup_rel t6,
    lu_elementrange_rel t5
WHERE
/* Attribute Joins */
      ((t1.item_id = t2.item_id
/* Customizing Begin */
  AND   t1.productgroup_id = t2.productgroup_id)
/* Customizing End */
  AND  (t2.pg_featurevalue_15_id = t3.pg_featurevalue_15_id)
  AND  (t3.pg_featurevalue_15_num BETWEEN t4.lbound AND t4.ubound)
  AND  (t1.pd_price_units_eur BETWEEN t5.lbound AND t5.ubound)
  AND  (t1.period_id = t6.value_id)
      )
/* Attribute Filters */
  AND ((t2.productgroup_id = 15520)
  AND  (t1.productgroup_id = 15520) /* Push Down Filters */
  AND  (t2.pg_featurevalue_01_id IN (103,104,107,110,113,134,148,167,171,186,192,216,2259,236,241,2477,24958,27445,297,3891,71,76,89,92,95))
  AND  (t2.pg_featurevalue_08_id IN (716,717))
  AND  (t2.pg_featurevalue_02_id IN (4165,4166))
  AND  (t2.pg_featurevalue_13_id = 5424)
  AND  (t4.elementrange_id IN (3091,3092))
  AND  (t5.elementrange_id IN (8693,8694,8695,8696,8697,8698,8699))
  AND  (t6.elementgroup_id = 14659)
  AND  (t1.period_id IN (20030699999060,20030799999030,20030799999060,20030799999120)) /* Resolved ElementGroup Filters */
      )
/* Fact Filters */
  AND (t1.project_type_id = '1'
      )
GROUP BY
    t2.pg_featurevalue_13_id,
    t2.pg_featurevalue_02_id,
    t4.elementrange_id,
    t2.pg_featurevalue_08_id,
    t2.pg_featurevalue_01_id,
    t5.elementrange_id,
    t2.productgroup_id,
    t6.elementgroup_id ; 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
B5424 B4165 r3092 B716 B192 r8699 B15520 G14659 0
B5424 B4165 r3092 B716 B186 r8699 B15520 G14659 175181.8
B5424 B4165 r3092 B716 B95 r8699 B15520 G14659 0
B5424 B4165 r3091 B716 B134 r8699 B15520 G14659 0
B5424 B4165 r3092 B716 B134 r8699 B15520 G14659 785280.11
B5424 B4166 r3092 B716 B134 r8699 B15520 G14659 200800
B5424 B4165 r3092 B716 B167 r8699 B15520 G14659 24591.49
B5424 B4165 r3092 B716 B110 r8699 B15520 G14659 0

    查看inmemory加载情况

SELECT OWNER, SEGMENT_NAME, INMEMORY_SIZE, POPULATE_STATUS FROM V$IM_SEGMENTS where owner='APPS';
--------------------------------------------------------------------------------------------------------------------------------------
APPS LU_ITEM_293 1310720 COMPLETED
APPS LU_ELEMENTRANGE_REL_Q2 1310720 COMPLETED
APPS FACT_PD_OUT_ITM_293 17235968 COMPLETED
APPS STS_JFV_TAB_CPLANS 1310720 COMPLETED
APPS LU_ELEMENTRANGE_REL 1310720 COMPLETED
APPS LU_PG_FEATUREVALUE_15_Q2 1310720 COMPLETED
APPS ADM_PG_FEATUREVALUE 4456448 COMPLETED
APPS LU_OUTLET_293 1310720 COMPLETED
APPS LU_ELEMENTGROUP_REL 1310720 COMPLETED
APPS ADM_CC_FEATUREVALUE 1310720 COMPLETED

    查看执行计划

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

SQL_ID  0mcv88ft7fwdj, child number 2
-------------------------------------
SELECT /* ORDERED INDEX(t1) USE_HASH(t1) */     'B' || 
t2.pg_featurevalue_13_id pg_featurevalue_13_id,     'B' || 
t2.pg_featurevalue_02_id pg_featurevalue_02_id,     'r' || 
t4.elementrange_id pg_featurevalue_15_id,     'B' || 
t2.pg_featurevalue_08_id pg_featurevalue_08_id,     'B' || 
t2.pg_featurevalue_01_id pg_featurevalue_01_id,     'r' || 
t5.elementrange_id price_eur_id,     'B' || t2.productgroup_id 
productgroup_id,     'G' || t6.elementgroup_id period_id,     
SUM(t1.pd_sales_units*t1.pd_projection_factor*t1.pd_price_units_eur) 
salesvalueeur FROM     lu_item_293 t2,     lu_pg_featurevalue_15 t3,    
 lu_elementrange_rel t4,     fact_pd_out_itm_293 t1,     
lu_elementgroup_rel t6,     lu_elementrange_rel t5 WHERE /* Attribute 
Joins */       ((t1.item_id = t2.item_id /* Customizing Begin */   AND  
 t1.productgroup_id = t2.productgroup_id) /* Customizing End */   AND  
(t2.pg_featurevalue_15_id = t3.pg_featurevalue_15_id)   AND  
(t3.pg_featurevalue_15_num BETWEEN t4.lbound AND t4.ubound)
 
Plan hash value: 331402865
 
------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                              | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                       |                            |       |       |  1153 (100)|          |        |      |            |
|   1 |  TEMP TABLE TRANSFORMATION                             |                            |       |       |            |          |        |      |            |
|   2 |   PX COORDINATOR                                       |                            |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)                                 | :TQ10001                   |   397 | 12704 |   225   (0)| 00:00:01 |  Q1,01 | P->S | QC (RAND)  |
|   4 |     LOAD AS SELECT (TEMP SEGMENT MERGE)                | SYS_TEMP_0FD9D6861_301F042 |       |       |            |          |  Q1,01 | PCWP |            |
|*  5 |      TABLE ACCESS BY INDEX ROWID BATCHED               | LU_ITEM_293                |   397 | 12704 |   225   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|   6 |       BUFFER SORT                                      |                            |       |       |            |          |  Q1,01 | PCWC |            |
|   7 |        PX RECEIVE                                      |                            |       |       |            |          |  Q1,01 | PCWP |            |
|   8 |         PX SEND HASH (BLOCK ADDRESS)                   | :TQ10000                   |       |       |            |          |        | S->P | HASH (BLOCK|
|   9 |          BITMAP CONVERSION TO ROWIDS                   |                            |       |       |            |          |        |      |            |
|  10 |           BITMAP AND                                   |                            |       |       |            |          |        |      |            |
|* 11 |            BITMAP INDEX SINGLE VALUE                   | LU_ITEM_274_PG_IDX         |       |       |            |          |        |      |            |
|  12 |            BITMAP OR                                   |                            |       |       |            |          |        |      |            |
|* 13 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 14 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 15 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 16 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 17 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 18 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 19 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 20 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 21 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 22 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 23 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 24 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 25 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 26 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 27 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 28 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 29 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 30 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 31 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 32 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 33 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 34 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 35 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 36 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|* 37 |             BITMAP INDEX SINGLE VALUE                  | LU_ITEM_274_FV01_IDX       |       |       |            |          |        |      |            |
|  38 |   PX COORDINATOR                                       |                            |       |       |            |          |        |      |            |
|  39 |    PX SEND QC (RANDOM)                                 | :TQ20004                   |     8 |   528 |  1153   (1)| 00:00:01 |  Q2,04 | P->S | QC (RAND)  |
|  40 |     HASH GROUP BY                                      |                            |     8 |   528 |  1153   (1)| 00:00:01 |  Q2,04 | PCWP |            |
|  41 |      PX RECEIVE                                        |                            |     8 |   528 |  1153   (1)| 00:00:01 |  Q2,04 | PCWP |            |
|  42 |       PX SEND HASH                                     | :TQ20003                   |     8 |   528 |  1153   (1)| 00:00:01 |  Q2,03 | P->P | HASH       |
|  43 |        HASH GROUP BY                                   |                            |     8 |   528 |  1153   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  44 |         MERGE JOIN                                     |                            |     9 |   594 |  1152   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  45 |          SORT JOIN                                     |                            |    14 |   714 |  1149   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  46 |           NESTED LOOPS                                 |                            |    14 |   714 |  1148   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  47 |            NESTED LOOPS                                |                            |    14 |   714 |  1148   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  48 |             VIEW                                       | VW_GBC_16                  |    14 |   490 |  1132   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  49 |              HASH GROUP BY                             |                            |    14 |  1232 |   907   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  50 |               PX RECEIVE                               |                            |    14 |  1232 |   907   (1)| 00:00:01 |  Q2,03 | PCWP |            |
|  51 |                PX SEND HASH                            | :TQ20001                   |    14 |  1232 |   907   (1)| 00:00:01 |  Q2,01 | P->P | HASH       |
|  52 |                 HASH GROUP BY                          |                            |    14 |  1232 |   907   (1)| 00:00:01 |  Q2,01 | PCWP |            |
|* 53 |                  HASH JOIN                             |                            |  2803 |   240K|   904   (1)| 00:00:01 |  Q2,01 | PCWP |            |
|* 54 |                   TABLE ACCESS INMEMORY FULL           | LU_ELEMENTGROUP_REL        |     4 |    44 |     4  (25)| 00:00:01 |  Q2,01 | PCWP |            |
|* 55 |                   HASH JOIN                            |                            |  2803 |   210K|   901   (1)| 00:00:01 |  Q2,01 | PCWP |            |
|  56 |                    PX RECEIVE                          |                            |     1 |    43 |     5   (0)| 00:00:01 |  Q2,01 | PCWP |            |
|  57 |                     PX SEND BROADCAST                  | :TQ20000                   |     1 |    43 |     5   (0)| 00:00:01 |  Q2,00 | P->P | BROADCAST  |
|  58 |                      MERGE JOIN CARTESIAN              |                            |     1 |    43 |     5   (0)| 00:00:01 |  Q2,00 | PCWP |            |
|* 59 |                       TABLE ACCESS FULL                | SYS_TEMP_0FD9D6861_301F042 |     1 |    28 |     2   (0)| 00:00:01 |  Q2,00 | PCWP |            |
|  60 |                       BUFFER SORT                      |                            |     7 |   105 |     3   (0)| 00:00:01 |  Q2,00 | PCWP |            |
|  61 |                        PX BLOCK ITERATOR               |                            |     7 |   105 |     2   (0)| 00:00:01 |  Q2,00 | PCWC |            |
|* 62 |                         TABLE ACCESS INMEMORY FULL     | LU_ELEMENTRANGE_REL        |     7 |   105 |     2   (0)| 00:00:01 |  Q2,00 | PCWP |            |
|  63 |                    PX BLOCK ITERATOR                   |                            | 10722 |   356K|   896   (1)| 00:00:01 |  Q2,01 | PCWC |            |
|* 64 |                     TABLE ACCESS BY INDEX ROWID BATCHED| FACT_PD_OUT_ITM_293        | 10722 |   356K|   896   (1)| 00:00:01 |  Q2,01 | PCWP |            |
|  65 |                      BITMAP CONVERSION TO ROWIDS       |                            |       |       |            |          |  Q2,01 | PCWP |            |
|  66 |                       BITMAP AND                       |                            |       |       |            |          |  Q2,01 | PCWP |            |
|  67 |                        BITMAP OR                       |                            |       |       |            |          |  Q2,01 | PCWP |            |
|* 68 |                         BITMAP INDEX SINGLE VALUE      | FACT_274_PER_IDX           |       |       |            |          |  Q2,01 | PCWP |            |
|* 69 |                         BITMAP INDEX SINGLE VALUE      | FACT_274_PER_IDX           |       |       |            |          |  Q2,01 | PCWP |            |
|* 70 |                         BITMAP INDEX SINGLE VALUE      | FACT_274_PER_IDX           |       |       |            |          |  Q2,01 | PCWP |            |
|* 71 |                         BITMAP INDEX SINGLE VALUE      | FACT_274_PER_IDX           |       |       |            |          |  Q2,01 | PCWP |            |
|  72 |                        BITMAP MERGE                    |                            |       |       |            |          |  Q2,01 | PCWP |            |
|  73 |                         BITMAP KEY ITERATION           |                            |       |       |            |          |  Q2,01 | PCWP |            |
|  74 |                          TABLE ACCESS FULL             | SYS_TEMP_0FD9D6861_301F042 |   397 |  2382 |     2   (0)| 00:00:01 |  Q2,01 | PCWP |            |
|* 75 |                          BITMAP INDEX RANGE SCAN       | FACT_274_ITEM_IDX          |       |       |            |          |  Q2,01 | PCWP |            |
|* 76 |             INDEX RANGE SCAN                           | ADM_PG_FEATUREVALUE_IDX2   |     1 |       |     1   (0)| 00:00:01 |  Q2,03 | PCWP |            |
|* 77 |            TABLE ACCESS BY INDEX ROWID                 | ADM_PG_FEATUREVALUE        |     1 |    16 |     1   (0)| 00:00:01 |  Q2,03 | PCWP |            |
|* 78 |          FILTER                                        |                            |       |       |            |          |  Q2,03 | PCWP |            |
|* 79 |           SORT JOIN                                    |                            |     2 |    30 |     3  (34)| 00:00:01 |  Q2,03 | PCWP |            |
|  80 |            BUFFER SORT                                 |                            |       |       |            |          |  Q2,03 | PCWC |            |
|  81 |             PX RECEIVE                                 |                            |     2 |    30 |     2   (0)| 00:00:01 |  Q2,03 | PCWP |            |
|  82 |              PX SEND BROADCAST                         | :TQ20002                   |     2 |    30 |     2   (0)| 00:00:01 |  Q2,02 | P->P | BROADCAST  |
|  83 |               PX BLOCK ITERATOR                        |                            |     2 |    30 |     2   (0)| 00:00:01 |  Q2,02 | PCWC |            |
|* 84 |                TABLE ACCESS INMEMORY FULL              | LU_ELEMENTRANGE_REL        |     2 |    30 |     2   (0)| 00:00:01 |  Q2,02 | PCWP |            |
------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   5 - filter(("T2"."PG_FEATUREVALUE_13_ID"=5424 AND INTERNAL_FUNCTION("T2"."PG_FEATUREVALUE_02_ID") AND INTERNAL_FUNCTION("T2"."PG_FEATUREVALUE_08_ID")))
  11 - access("T2"."PRODUCTGROUP_ID"=15520)
  13 - access("T2"."PG_FEATUREVALUE_01_ID"=71)
  14 - access("T2"."PG_FEATUREVALUE_01_ID"=76)
  15 - access("T2"."PG_FEATUREVALUE_01_ID"=89)
  16 - access("T2"."PG_FEATUREVALUE_01_ID"=92)
  17 - access("T2"."PG_FEATUREVALUE_01_ID"=95)
  18 - access("T2"."PG_FEATUREVALUE_01_ID"=103)
  19 - access("T2"."PG_FEATUREVALUE_01_ID"=104)
  20 - access("T2"."PG_FEATUREVALUE_01_ID"=107)
  21 - access("T2"."PG_FEATUREVALUE_01_ID"=110)
  22 - access("T2"."PG_FEATUREVALUE_01_ID"=113)
  23 - access("T2"."PG_FEATUREVALUE_01_ID"=134)
  24 - access("T2"."PG_FEATUREVALUE_01_ID"=148)
  25 - access("T2"."PG_FEATUREVALUE_01_ID"=167)
  26 - access("T2"."PG_FEATUREVALUE_01_ID"=171)
  27 - access("T2"."PG_FEATUREVALUE_01_ID"=186)
  28 - access("T2"."PG_FEATUREVALUE_01_ID"=192)
  29 - access("T2"."PG_FEATUREVALUE_01_ID"=216)
  30 - access("T2"."PG_FEATUREVALUE_01_ID"=236)
  31 - access("T2"."PG_FEATUREVALUE_01_ID"=241)
  32 - access("T2"."PG_FEATUREVALUE_01_ID"=297)
  33 - access("T2"."PG_FEATUREVALUE_01_ID"=2259)
  34 - access("T2"."PG_FEATUREVALUE_01_ID"=2477)
  35 - access("T2"."PG_FEATUREVALUE_01_ID"=3891)
  36 - access("T2"."PG_FEATUREVALUE_01_ID"=24958)
  37 - access("T2"."PG_FEATUREVALUE_01_ID"=27445)
  53 - access("T1"."PERIOD_ID"="T6"."VALUE_ID")
  54 - inmemory(("T6"."ELEMENTGROUP_ID"=14659 AND INTERNAL_FUNCTION("T6"."VALUE_ID")))
       filter(("T6"."ELEMENTGROUP_ID"=14659 AND INTERNAL_FUNCTION("T6"."VALUE_ID")))
  55 - access("T1"."PRODUCTGROUP_ID"="C1" AND "T1"."ITEM_ID"="C0")
       filter(("T1"."PD_PRICE_UNITS_EUR">="T5"."LBOUND" AND "T1"."PD_PRICE_UNITS_EUR"<="T5"."UBOUND"))
  59 - filter("C1"=15520)
  62 - inmemory(:Z>=:Z AND :Z<=:Z AND (("T5"."ELEMENTRANGE_ID"=8693 OR "T5"."ELEMENTRANGE_ID"=8694 OR "T5"."ELEMENTRANGE_ID"=8695 OR 
              "T5"."ELEMENTRANGE_ID"=8696 OR "T5"."ELEMENTRANGE_ID"=8697 OR "T5"."ELEMENTRANGE_ID"=8698 OR "T5"."ELEMENTRANGE_ID"=8699)))
       filter(("T5"."ELEMENTRANGE_ID"=8693 OR "T5"."ELEMENTRANGE_ID"=8694 OR "T5"."ELEMENTRANGE_ID"=8695 OR "T5"."ELEMENTRANGE_ID"=8696 OR 
              "T5"."ELEMENTRANGE_ID"=8697 OR "T5"."ELEMENTRANGE_ID"=8698 OR "T5"."ELEMENTRANGE_ID"=8699))
  64 - filter(("T1"."PRODUCTGROUP_ID"=15520 AND "T1"."PROJECT_TYPE_ID"='1'))
  68 - access("T1"."PERIOD_ID"=20030699999060)
  69 - access("T1"."PERIOD_ID"=20030799999030)
  70 - access("T1"."PERIOD_ID"=20030799999060)
  71 - access("T1"."PERIOD_ID"=20030799999120)
  75 - access("T1"."ITEM_ID"="C0")
  76 - access("ITEM_1"="FEATUREVALUE_ID")
  77 - filter(("TABLE_NR"=15 AND "DELETED"=0))
  78 - filter("FEATUREVALUE_NUM"<="T4"."UBOUND")
  79 - access(INTERNAL_FUNCTION("FEATUREVALUE_NUM")>=INTERNAL_FUNCTION("T4"."LBOUND"))
       filter(INTERNAL_FUNCTION("FEATUREVALUE_NUM")>=INTERNAL_FUNCTION("T4"."LBOUND"))
  84 - inmemory(:Z>=:Z AND :Z<=:Z AND (("T4"."ELEMENTRANGE_ID"=3091 OR "T4"."ELEMENTRANGE_ID"=3092)))
       filter(("T4"."ELEMENTRANGE_ID"=3091 OR "T4"."ELEMENTRANGE_ID"=3092))
 
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 2
   - parallel scans affinitized for inmemory
   - star transformation used for this statement
   - statistics feedback used for this statement
        
    下面研究一下统计信息中与表连接、组函数和多条谓词有关的值:

SELECT DISPLAY_NAME, VALUE
FROM V$MYSTAT m, V$STATNAME n
WHERE m.STATISTIC# = n.STATISTIC#
AND n.DISPLAY_NAME IN (
'IM scan bytes in-memory',
'IM scan bytes uncompressed',
'IM scan CUs columns accessed',
'IM scan CUs columns theoretical max',
'IM scan segments minmax eligible',
'IM scan CUs pruned',
'IM scan rows',
'IM scan rows valid',
'IM scan rows optimized');

DISPLAY_NAME                                                          VALUE
---------------------------------------------------------------- ----------
IM scan bytes in-memory                                            17151131
IM scan bytes uncompressed                                        168738144
IM scan CUs columns accessed                                             26
IM scan CUs columns theoretical max                                     278
IM scan rows                                                        1287827
IM scan rows valid                                                   748402
IM scan rows optimized                                               539125
IM scan CUs pruned                                                        1
IM scan segments minmax eligible                                         10

9 rows selected.
 
    IM scan bytes in-memory/IM scan bytes uncompressed:IMCU中压缩的字节大小(真实)与IMCU中如果不压缩的字节大小之比。这个比值越小说明压缩率越高,内存空间利用效率越高。
    IM scan CUs columns accessed/IM scan CUs columns theoretical max:IMCU中实际访问的列数与如果使用行格式要访问的行数。这个比值越低越好,它充分说明了列格式只需要访问必需访问的列,而不需要访问同一行中的其他列。当研究的查询中包含组函数时,会看见这个比值很低。IM column store 仅仅需要扫描3个列 :t1.pd_sales_units*t1.pd_projection_factor*t1.pd_price_units_eur,而传统的行格式需要扫描每一行的那些其他列直到访问到那3个列为止。我们也能从卓越的压缩率中受益。我们也能通过列格式自如轻松地实现SIMD向量处理。
    IM scan rows/IM scan rows valid/IM scan rows optimizedIM scan rows-IM scan rows valid=IM scan rows optimized。要访问的行数减掉实际访问的行数等于优化的行数。优化的行数越多越好。这个值综合反映了所有谓词(包含不等值连接谓词)在IM column store中的过滤效率。                                                   
    IM scan CUs pruned/IM scan segments minmax eligible:IMCU中对于某个谓词可以裁剪的列的个数与所有要访问的列个数之比。这个比值越高越好。当所研究的查询中包含单行谓词并且过滤条件合适时,就会看见这个比值很高。IM column store能够访问每个列上的存储索引(这些存储索引存储于IMCU中),利用这些索引可以实现min/max裁剪。单行谓词会与IM column store中存储的对应的列的min/max范围作比较,如果其值不落在这个范围内,该列就直接被裁剪掉(跳过)。   

3. 优化器与In-Memory加载过程:

3.1 布隆过滤器:
    在查看执行计划时,在伴随In-memory加载的过程中,除了上面看到的星型转换 star transformation used for this statement 和自动并行度automatic DOP: Computed Degree of Parallelism is 2外,还会经常看到(甚至在同一个执行计划中会出现多个):

  JOIN FILTER USE               | :BF0000              |   191K|  6369K|   304  (16)| 
 
    这个“:BF0000” 叫做布隆过滤器。它最早出现在Oracle Database 10g中,用以增强hash join。通过SIMD向量处理,过滤器更适合应用于Inmemory列格式。当两个表通过hash join连接到一起时,第一张表(通常是小表)将被首先扫描。那些满足where条件(谓词)的行将被用于创建一个哈希表。 在哈希表创建过程中,在连接列上会同时创建一个比特向量或称为布过滤器的东西。该比特向量将作为额外的谓词传递给第二个表用于扫描。在谓词被应用到第二表上之后,结果集中的行上的那个连接列会被哈希化并与比特向量作比较。 如果发现该行上的该列和比特向量匹配,那么该行将会被送去作哈希连接。如果不匹配,该行就会被直接抛弃。在Exadata一体机环境中,布过滤器或比特向量会被转移给存储单元以极高的效率执行。布过滤把表连接转换成一种过虑过程,这种过滤过程作为对事实表扫描的一部分来执行。通过使用多个布过滤器,我们可以仅仅扫描事实表上所需要的列。这意味着在扫描过程中,我们可以从高效地排除行的过程中受益而不是等待连接过程来做这件事情。布过滤器能够充分地利用Inmemory的存储索引和min/max裁剪来工作。
 
3.2 星型转换:
    如上面看到的,Inmemory可以和星型转换协同工作。

3.3 并行执行:
    如上面看到的,Inmemory可以和SQL并行协同工作。

3.4 向量转换:

    Inmemory引入的新的执行方式为向量转换,它的语法是:

SQL> SELECT /*+ VECTOR_TRANSFORM */
    'B' || t2.pg_featurevalue_13_id pg_featurevalue_13_id,
    'B' || t2.pg_featurevalue_02_id pg_featurevalue_02_id,
    'r' || t4.elementrange_id pg_featurevalue_15_id,
    'B' || t2.pg_featurevalue_08_id pg_featurevalue_08_id,
    'B' || t2.pg_featurevalue_01_id pg_featurevalue_01_id,
    'r' || t5.elementrange_id price_eur_id,
    'B' || t2.productgroup_id productgroup_id,
    'G' || t6.elementgroup_id period_id,
    SUM(t1.pd_sales_units*t1.pd_projection_factor*t1.pd_price_units_eur) salesvalueeur
......

    如果采用了向量转换,那么基于对表的扫描的结果,一种全新的数据结构将被创建出来。该数据结构被称为键值向量。 键值向量与布隆过滤器类似,它会把自己作为额外的谓词来参与事实表的扫描。更加厉害的是它能在扫描的同时执行group by或组函数计算,而不是事后再做这些。在执行计划中表现为:

| 10 | KEY VECTOR CREATE BUFFERED | :KV0000
 
   这种新的转换允许我们不仅能够把表连接转换成对表扫描的过滤,而且可以在对事实表的扫描过程中把分组计算操作同时完成。





路过

雷人

握手

鲜花

鸡蛋

QQ|手机版|Bo's Oracle Station   

GMT+8, 2023-5-28 18:14 , Processed in 0.033846 second(s), 21 queries .

返回顶部