jeudi 7 juillet 2011

BITMAP CONVERSION FROM ROWIDS

J’ai rencontré un problème de performance cette semaine sur une base 10g pour une requête me donnant le plan d’exécution suivant :
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name                        | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                             |      1 |        |   2890 |00:30:05.06 |      24M|    182K|       |       |          |
|   1 |  SORT AGGREGATE                        |                             |   2890 |      1 |   2890 |00:00:24.11 |    8865 |   4811 |       |       |          |
|*  2 |   FILTER                               |                             |   2890 |        |   2890 |00:00:24.09 |    8865 |   4811 |       |       |          |
|   3 |    FIRST ROW                           |                             |   2890 |      1 |   2890 |00:00:24.07 |    8865 |   4811 |       |       |          |
|*  4 |     INDEX RANGE SCAN (MIN/MAX)         | IDX_CTP_POSITIONS_NAV       |   2890 |      1 |   2890 |00:00:24.06 |    8865 |   4811 |       |       |          |
|   5 |    SORT AGGREGATE                      |                             |    233 |      1 |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|*  6 |     FILTER                             |                             |    233 |        |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|   7 |      FIRST ROW                         |                             |    233 |      1 |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|*  8 |       INDEX RANGE SCAN (MIN/MAX)       | IDX_CTP_POSITIONS_NAV       |    233 |      1 |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|*  9 |  COUNT STOPKEY                         |                             |    515 |        |    321 |00:00:01.77 |    2820 |    609 |       |       |          |
|* 10 |   TABLE ACCESS BY INDEX ROWID          | MUT_EXCHANGE_NORM_LINK      |    515 |      1 |    321 |00:00:01.77 |    2820 |    609 |       |       |          |
|* 11 |    INDEX RANGE SCAN                    | IDX_ENL_OBJ_ID              |    515 |      3 |   1968 |00:00:00.53 |    1553 |    171 |       |       |          |
|* 12 |  COUNT STOPKEY                         |                             |    515 |        |    320 |00:00:00.20 |    2901 |    254 |       |       |          |
|* 13 |   TABLE ACCESS BY INDEX ROWID          | MUT_EXCHANGE_NORM_LINK      |    515 |      1 |    320 |00:00:00.20 |    2901 |    254 |       |       |          |
|* 14 |    INDEX RANGE SCAN                    | IDX_ENL_OBJ_ID              |    515 |      3 |   2459 |00:00:00.01 |    1550 |      4 |       |       |          |
|* 15 |  COUNT STOPKEY                         |                             |   2286 |        |    255 |00:00:06.17 |   14003 |   1748 |       |       |          |
|* 16 |   TABLE ACCESS BY INDEX ROWID          | MUT_EXCHANGE_NORM_LINK      |   2286 |      1 |    255 |00:00:06.16 |   14003 |   1748 |       |       |          |
|* 17 |    INDEX RANGE SCAN                    | IDX_ENL_OBJ_ID              |   2286 |      3 |   8135 |00:00:01.52 |    6892 |    551 |       |       |          |
|* 18 |  COUNT STOPKEY                         |                             |   2286 |        |   1920 |00:00:00.10 |   11594 |     17 |       |       |          |
|* 19 |   TABLE ACCESS BY INDEX ROWID          | MUT_EXCHANGE_NORM_LINK      |   2286 |      1 |   1920 |00:00:00.09 |   11594 |     17 |       |       |          |
|* 20 |    INDEX RANGE SCAN                    | IDX_ENL_OBJ_ID              |   2286 |      3 |   5128 |00:00:00.03 |    6876 |      0 |       |       |          |
|  21 |  TABLE ACCESS BY INDEX ROWID           | VMAT_TITRE                  |   2286 |      1 |   2286 |00:00:04.90 |    4766 |   1263 |       |       |          |
|* 22 |   INDEX UNIQUE SCAN                    | PK_VMAT_TITRE               |   2286 |      1 |   2286 |00:00:00.59 |    2480 |    173 |       |       |          |
|  23 |  NESTED LOOPS                          |                             |    515 |      1 |    505 |00:00:00.04 |    1845 |      2 |       |       |          |
|* 24 |   TABLE ACCESS BY INDEX ROWID          | MUT_ROOT2                   |    515 |      1 |    505 |00:00:00.01 |    1186 |      0 |       |       |          |
|* 25 |    INDEX UNIQUE SCAN                   | PK_ROOT2                    |    515 |      1 |    515 |00:00:00.01 |     671 |      0 |       |       |          |
|  26 |   TABLE ACCESS BY INDEX ROWID          | MUT_COUNTRY_ISO2            |    505 |    268 |    505 |00:00:00.02 |     659 |      2 |       |       |          |
|* 27 |    INDEX UNIQUE SCAN                   | PK_MUT_COUNTRY_ISO2         |    505 |      1 |    505 |00:00:00.01 |     154 |      1 |       |       |          |
|  28 |  NESTED LOOPS                          |                             |      1 |      1 |   2890 |00:30:05.06 |      24M|    182K|       |       |          |
|  29 |   NESTED LOOPS                         |                             |      1 |      1 |  10824 |00:30:04.25 |      24M|    182K|       |       |          |
|  30 |    NESTED LOOPS                        |                             |      1 |      1 |  10824 |00:30:04.11 |      24M|    182K|       |       |          |
|  31 |     NESTED LOOPS                       |                             |      1 |      1 |  10824 |00:29:57.30 |      24M|    181K|       |       |          |
|  32 |      NESTED LOOPS                      |                             |      1 |      1 |  10965 |00:29:54.73 |      24M|    180K|       |       |          |
|  33 |       NESTED LOOPS                     |                             |      1 |      1 |  10965 |00:29:53.98 |      24M|    180K|       |       |          |
|* 34 |        TABLE ACCESS FULL               | MUT_INVESTMENT_LINK         |      1 |  61863 |  61846 |00:00:00.25 |     698 |      0 |       |       |          |
|* 35 |        TABLE ACCESS BY INDEX ROWID     | MUT_COMPTE_TITRE_POSITION_2 |  61846 |      1 |  10965 |00:29:53.69 |      24M|    180K|       |       |          |
|  36 |         BITMAP CONVERSION TO ROWIDS    |                             |  61846 |        |  25438 |00:28:56.72 |      24M|    169K|       |       |          |
|  37 |          BITMAP AND                    |                             |  61846 |        |  25438 |00:28:56.57 |      24M|    169K|       |       |          |
|  38 |           BITMAP CONVERSION FROM ROWIDS|                             |  61846 |        |  61694 |00:06:30.95 |     350K|    169K|       |       |          |
|* 39 |            INDEX RANGE SCAN            | IDX_CTP2_TITRE_COMPTE_ID    |  61846 |      1 |     36M|00:06:03.37 |     350K|    169K|       |       |          |
|  40 |           BITMAP CONVERSION FROM ROWIDS|                             |  61846 |        |    107K|00:22:18.21 |      24M|      0 |       |       |          |
|* 41 |            INDEX RANGE SCAN            | IDX_DAY                     |  61846 |      1 |   2095M|00:00:01.14 |      24M|      0 |       |       |          |
|* 42 |       TABLE ACCESS BY INDEX ROWID      | MUT_INVESTMENT_LINK         |  10965 |      1 |  10965 |00:00:00.73 |   22125 |    149 |       |       |          |
|* 43 |        INDEX UNIQUE SCAN               | PK_INVESTMENTLINK           |  10965 |      1 |  10965 |00:00:00.62 |   11160 |    149 |       |       |          |
|* 44 |      TABLE ACCESS BY INDEX ROWID       | MUT_ROOT2                   |  10965 |      1 |  10824 |00:00:02.55 |   22125 |    388 |       |       |          |
|* 45 |       INDEX UNIQUE SCAN                | PK_ROOT2                    |  10965 |      1 |  10965 |00:00:00.24 |   11160 |     61 |       |       |          |
|  46 |     TABLE ACCESS BY INDEX ROWID        | MUT_ROOT2                   |  10824 |      1 |  10824 |00:00:06.79 |   21844 |    995 |       |       |          |
|* 47 |      INDEX UNIQUE SCAN                 | PK_ROOT2                    |  10824 |      1 |  10824 |00:00:00.37 |   11019 |     90 |       |       |          |
|  48 |    TABLE ACCESS BY INDEX ROWID         | DEVISE                      |  10824 |      1 |  10824 |00:00:00.12 |   11019 |      7 |       |       |          |
|* 49 |     INDEX UNIQUE SCAN                  | PK_DEVISE                   |  10824 |      1 |  10824 |00:00:00.06 |     195 |      0 |       |       |          |
|  50 |   VIEW                                 |                             |  10824 |      1 |   2890 |00:00:00.78 |   43296 |     65 |       |       |          |
|  51 |    SORT UNIQUE                         |                             |  10824 |      2 |   2890 |00:00:00.76 |   43296 |     65 |  2048 |  2048 |          |
|  52 |     UNION ALL PUSHED PREDICATE         |                             |  10824 |        |   2890 |00:00:00.55 |   43296 |     65 |       |       |          |
|* 53 |      INDEX UNIQUE SCAN                 | PK_MUT_SERIE                |  10824 |      1 |   2219 |00:00:00.38 |   21648 |     64 |       |       |          |
|* 54 |      INDEX UNIQUE SCAN                 | PK_MUT_MUTUALFUND_CLASS     |  10824 |      1 |    671 |00:00:00.09 |   21648 |      1 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   2 - filter(TO_DATE(:SYS_B_00,:SYS_B_01)<=TO_DATE(:SYS_B_02,:SYS_B_03))
   4 - access("TOTO"."CTP_COMPTE_ID"=:B1 AND "TOTO"."CTP_TITRE_ID"=:B2 AND "LYX_DAY">=TO_DATE(:SYS_B_00,:SYS_B_01) AND
              "LYX_DAY"<=TO_DATE(:SYS_B_02,:SYS_B_03))
       filter("TOTO"."CTP_POS_GLOBAL"=:B1)
   6 - filter(TO_DATE(:SYS_B_08,:SYS_B_09)<=TO_DATE(:SYS_B_10,:SYS_B_11))
   8 - access("TOTO"."CTP_COMPTE_ID"=:B1 AND "TOTO"."CTP_TITRE_ID"=:B2 AND "LYX_DAY">=TO_DATE(:SYS_B_08,:SYS_B_09) AND
              "LYX_DAY"<=TO_DATE(:SYS_B_10,:SYS_B_11))
       filter("TOTO"."CTP_POS_GLOBAL"=:B1)
   9 - filter(ROWNUM=:SYS_B_15)
  10 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_14)
  11 - access("ENL_OBJECT_ID"=:B1)
  12 - filter(ROWNUM=:SYS_B_17)
  13 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_16)
  14 - access("ENL_OBJECT_ID"=:B1)
  15 - filter(ROWNUM=:SYS_B_21)
  16 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_20)
  17 - access("ENL_OBJECT_ID"=:B1)
  18 - filter(ROWNUM=:SYS_B_23)
  19 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_22)
  20 - access("ENL_OBJECT_ID"=:B1)
  22 - access("TIT_ID"=:B1)
  24 - filter("ROO_DROIT_COUNTRY_ID" IS NOT NULL)
  25 - access("ROO_ID"=:B1)
  27 - access("ROO_DROIT_COUNTRY_ID"="CRY_ID")
  34 - filter("GRL_STARTDATE"<=TO_DATE(:SYS_B_36,:SYS_B_37))
  35 - filter(("POSITION"."CTP_POS_GLOBAL">:SYS_B_32 AND ("GRL_STOPDATE" IS NULL OR "GRL_STOPDATE">="LYX_DAY")))
  39 - access("GRL_SLAVEINTERFACE_ID"="CTP_TITRE_ID" AND "GRL_COMPTE_ID"="CTP_COMPTE_ID")
  41 - access("POSITION"."LYX_DAY"=TO_DATE(:SYS_B_36,:SYS_B_37))
       filter("GRL_STARTDATE"<="LYX_DAY")
  42 - filter("GRL_MASTERINTERFACE_ID"<>:SYS_B_27)
  43 - access("GRL_ID"="GRL_ID")
  44 - filter(("VCOMP"."ROO_FUND_ID"<>:SYS_B_33 AND "VCOMP"."ROO_FUND_ID"<>:SYS_B_34 AND "VCOMP"."ROO_FUND_ID"<>:SYS_B_35))
  45 - access("VCOMP"."ROO_ID"="GRL_MASTERINTERFACE_ID")
       filter(("VCOMP"."ROO_ID"<>:SYS_B_27 AND "VCOMP"."ROO_ID"<>:SYS_B_28 AND "VCOMP"."ROO_ID"<>:SYS_B_29 AND "VCOMP"."ROO_ID"<>:SYS_B_30 AND
              "VCOMP"."ROO_ID"<>:SYS_B_31))
  47 - access("VFUNDSHARES"."ROO_ID"="GRL_SLAVEINTERFACE_ID")
  49 - access("DEVISE"."DEV_ID"="VFUNDSHARES"."ROO_DEVISE_ID")
  53 - access("SER_ID"="VFUNDSHARES"."ROO_ID")
  54 - access("MFC_ID"="VFUNDSHARES"."ROO_ID")
En regardant la première ligne du plan on voit que la requête a généré environ 24 millions de logical reads (colonne BUFFERS du plan) pour retourner 2890 lignes (colonne A-ROWS du plan). Le temps réel base de données consommé pour l’exécution de cette requête a été de 30 minutes (colonne A-TIME).

En regardant plus bas dans le plan on se rend compte que le coût de cette requête est lié aux opérations « BITMAP CONVERSION FROM ROWIDS » (OPERATION ID 38 et 40).

Cette opération s’effectue lorsque le CBO a décidé lors de son calcul de plan qu’il était judicieux de convertir les deux index b-tree IDX_DAY et IDX_CTP2_TITRE_COMPTE_ID en index BITMAP pour pouvoir les combiner avec l’opération BITMAP AND. Il faut se souvenir que l’une des grandes forces des index bitmap réside dans le fait de pouvoir combiner ces index efficacement lorsque dans la clause WHERE d’une requête on combine les prédicats via des clauses « AND » et/ou « OR »(opérations bit-and et bit-or). C’est d’ailleurs pour cela que vous ne verrez presque jamais d’index bitmap composites. Il est plus intéressant d'avoir des index bitmap pour une seule colonne.

L'inconvénient est que cette opération est très consommatrice notamment en CPU, et lorsque cette conversion d’index B-TREE en index BITMAP est effectuée de manière inappropriée (comme c’est le cas ici) les conséquences peuvent être désastreuses.

Dans mon exemple, le CBO semble avoir choisi d’effectuer cette conversion parce qu’il se trompe sur les cardinalités retournées par les INDEX RANGE SCAN. Par exemple, le CBO estime que chaque accès à l'index IDX_CTP2_TITRE_COMPTE_ID va retourner une seule ligne au lieu de 582 lignes (36M/61846). Cette erreur dans l'estimation des cardinalités va induire une erreur dans le choix des types d'accès et des méthodes de jointures.

La prise en compte par le CBO de cette conversion à la volée d’index B-TREE en index BITMAP est contrôlé par le paramètre caché « _B_TREE_BITMAP_PLANS » qui est à TRUE en 10g.

En désactivant ce paramètre au niveau de ma session il m’est possible de me débarrasser de l’opération « BITMAP CONVERSION FROM ROWIDS » pour cette requête:

SQL> alter session set "_B_TREE_BITMAP_PLANS"=FALSE;

Session altered.


Plan hash value: 2287023889

---------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name                        | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                             |      1 |        |   2890 |00:00:04.88 |     122K|   2754 |       |       |          |
|   1 |  SORT AGGREGATE                   |                             |   2890 |      1 |   2890 |00:00:00.12 |    8864 |      0 |       |       |          |
|*  2 |   FILTER                          |                             |   2890 |        |   2890 |00:00:00.10 |    8864 |      0 |       |       |          |
|   3 |    FIRST ROW                      |                             |   2890 |      1 |   2890 |00:00:00.09 |    8864 |      0 |       |       |          |
|*  4 |     INDEX RANGE SCAN (MIN/MAX)    | IDX_CTP_POSITIONS_NAV       |   2890 |      1 |   2890 |00:00:00.08 |    8864 |      0 |       |       |          |
|   5 |    SORT AGGREGATE                 |                             |    233 |      1 |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|*  6 |     FILTER                        |                             |    233 |        |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|   7 |      FIRST ROW                    |                             |    233 |      1 |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|*  8 |       INDEX RANGE SCAN (MIN/MAX)  | IDX_CTP_POSITIONS_NAV       |    233 |      1 |    233 |00:00:00.01 |     771 |      0 |       |       |          |
|*  9 |  COUNT STOPKEY                    |                             |    515 |        |    321 |00:00:00.03 |    2819 |      0 |       |       |          |
|* 10 |   TABLE ACCESS BY INDEX ROWID     | MUT_EXCHANGE_NORM_LINK      |    515 |      1 |    321 |00:00:00.02 |    2819 |      0 |       |       |          |
|* 11 |    INDEX RANGE SCAN               | IDX_ENL_OBJ_ID              |    515 |      3 |   1968 |00:00:00.01 |    1553 |      0 |       |       |          |
|* 12 |  COUNT STOPKEY                    |                             |    515 |        |    320 |00:00:00.02 |    2899 |      0 |       |       |          |
|* 13 |   TABLE ACCESS BY INDEX ROWID     | MUT_EXCHANGE_NORM_LINK      |    515 |      1 |    320 |00:00:00.02 |    2899 |      0 |       |       |          |
|* 14 |    INDEX RANGE SCAN               | IDX_ENL_OBJ_ID              |    515 |      3 |   2459 |00:00:00.01 |    1550 |      0 |       |       |          |
|* 15 |  COUNT STOPKEY                    |                             |   2286 |        |    255 |00:00:00.11 |   13998 |      0 |       |       |          |
|* 16 |   TABLE ACCESS BY INDEX ROWID     | MUT_EXCHANGE_NORM_LINK      |   2286 |      1 |    255 |00:00:00.11 |   13998 |      0 |       |       |          |
|* 17 |    INDEX RANGE SCAN               | IDX_ENL_OBJ_ID              |   2286 |      3 |   8135 |00:00:00.05 |    6891 |      0 |       |       |          |
|* 18 |  COUNT STOPKEY                    |                             |   2286 |        |   1920 |00:00:00.07 |   11594 |      0 |       |       |          |
|* 19 |   TABLE ACCESS BY INDEX ROWID     | MUT_EXCHANGE_NORM_LINK      |   2286 |      1 |   1920 |00:00:00.06 |   11594 |      0 |       |       |          |
|* 20 |    INDEX RANGE SCAN               | IDX_ENL_OBJ_ID              |   2286 |      3 |   5128 |00:00:00.03 |    6876 |      0 |       |       |          |
|  21 |  TABLE ACCESS BY INDEX ROWID      | VMAT_TITRE                  |   2286 |      1 |   2286 |00:00:00.05 |    4766 |      0 |       |       |          |
|* 22 |   INDEX UNIQUE SCAN               | PK_VMAT_TITRE               |   2286 |      1 |   2286 |00:00:00.03 |    2480 |      0 |       |       |          |
|  23 |  NESTED LOOPS                     |                             |    515 |      1 |    505 |00:00:00.02 |    1845 |      0 |       |       |          |
|* 24 |   TABLE ACCESS BY INDEX ROWID     | MUT_ROOT2                   |    515 |      1 |    505 |00:00:00.01 |    1186 |      0 |       |       |          |
|* 25 |    INDEX UNIQUE SCAN              | PK_ROOT2                    |    515 |      1 |    515 |00:00:00.01 |     671 |      0 |       |       |          |
|  26 |   TABLE ACCESS BY INDEX ROWID     | MUT_COUNTRY_ISO2            |    505 |    268 |    505 |00:00:00.01 |     659 |      0 |       |       |          |
|* 27 |    INDEX UNIQUE SCAN              | PK_MUT_COUNTRY_ISO2         |    505 |      1 |    505 |00:00:00.01 |     154 |      0 |       |       |          |
|  28 |  NESTED LOOPS                     |                             |      1 |      1 |   2890 |00:00:04.88 |     122K|   2754 |       |       |          |
|  29 |   NESTED LOOPS                    |                             |      1 |      1 |   2890 |00:00:04.83 |     119K|   2754 |       |       |          |
|  30 |    NESTED LOOPS                   |                             |      1 |      1 |  10824 |00:00:04.43 |   76378 |   2754 |       |       |          |
|  31 |     NESTED LOOPS                  |                             |      1 |      1 |  10824 |00:00:04.24 |   54535 |   2754 |       |       |          |
|  32 |      NESTED LOOPS                 |                             |      1 |      1 |  10965 |00:00:04.04 |   32410 |   2754 |       |       |          |
|* 33 |       HASH JOIN                   |                             |      1 |      1 |  10965 |00:00:03.86 |   10285 |   2754 |  2190K|  1131K| 2911K (0)|
|* 34 |        TABLE ACCESS BY INDEX ROWID| MUT_COMPTE_TITRE_POSITION_2 |      1 |   9796 |  21293 |00:00:03.53 |    9588 |   2754 |       |       |          |
|* 35 |         INDEX RANGE SCAN          | IDX_DAY                     |      1 |  14258 |  34240 |00:00:00.03 |     400 |      0 |       |       |          |
|* 36 |        TABLE ACCESS FULL          | MUT_INVESTMENT_LINK         |      1 |  61863 |  61846 |00:00:00.07 |     697 |      0 |       |       |          |
|* 37 |       TABLE ACCESS BY INDEX ROWID | MUT_INVESTMENT_LINK         |  10965 |      1 |  10965 |00:00:00.16 |   22125 |      0 |       |       |          |
|* 38 |        INDEX UNIQUE SCAN          | PK_INVESTMENTLINK           |  10965 |      1 |  10965 |00:00:00.09 |   11160 |      0 |       |       |          |
|* 39 |      TABLE ACCESS BY INDEX ROWID  | MUT_ROOT2                   |  10965 |      1 |  10824 |00:00:00.17 |   22125 |      0 |       |       |          |
|* 40 |       INDEX UNIQUE SCAN           | PK_ROOT2                    |  10965 |      1 |  10965 |00:00:00.09 |   11160 |      0 |       |       |          |
|  41 |     TABLE ACCESS BY INDEX ROWID   | MUT_ROOT2                   |  10824 |      1 |  10824 |00:00:00.16 |   21843 |      0 |       |       |          |
|* 42 |      INDEX UNIQUE SCAN            | PK_ROOT2                    |  10824 |      1 |  10824 |00:00:00.08 |   11019 |      0 |       |       |          |
|  43 |    VIEW                           |                             |  10824 |      1 |   2890 |00:00:00.39 |   43296 |      0 |       |       |          |
|  44 |     SORT UNIQUE                   |                             |  10824 |      2 |   2890 |00:00:00.36 |   43296 |      0 |  2048 |  2048 | 2048  (0)|
|  45 |      UNION ALL PUSHED PREDICATE   |                             |  10824 |        |   2890 |00:00:00.28 |   43296 |      0 |       |       |          |
|* 46 |       INDEX UNIQUE SCAN           | PK_MUT_SERIE                |  10824 |      1 |   2219 |00:00:00.10 |   21648 |      0 |       |       |          |
|* 47 |       INDEX UNIQUE SCAN           | PK_MUT_MUTUALFUND_CLASS     |  10824 |      1 |    671 |00:00:00.08 |   21648 |      0 |       |       |          |
|  48 |   TABLE ACCESS BY INDEX ROWID     | DEVISE                      |   2890 |      1 |   2890 |00:00:00.04 |    3084 |      0 |       |       |          |
|* 49 |    INDEX UNIQUE SCAN              | PK_DEVISE                   |   2890 |      1 |   2890 |00:00:00.02 |     194 |      0 |       |       |          |
---------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   2 - filter(TO_DATE(:SYS_B_00,:SYS_B_01)<=TO_DATE(:SYS_B_02,:SYS_B_03))
   4 - access("TOTO"."CTP_COMPTE_ID"=:B1 AND "TOTO"."CTP_TITRE_ID"=:B2 AND "LYX_DAY">=TO_DATE(:SYS_B_00,:SYS_B_01) AND
              "LYX_DAY"<=TO_DATE(:SYS_B_02,:SYS_B_03))
       filter("TOTO"."CTP_POS_GLOBAL"=:B1)
   6 - filter(TO_DATE(:SYS_B_08,:SYS_B_09)<=TO_DATE(:SYS_B_10,:SYS_B_11))
   8 - access("TOTO"."CTP_COMPTE_ID"=:B1 AND "TOTO"."CTP_TITRE_ID"=:B2 AND "LYX_DAY">=TO_DATE(:SYS_B_08,:SYS_B_09) AND
              "LYX_DAY"<=TO_DATE(:SYS_B_10,:SYS_B_11))
       filter("TOTO"."CTP_POS_GLOBAL"=:B1)
   9 - filter(ROWNUM=:SYS_B_15)
  10 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_14)
  11 - access("ENL_OBJECT_ID"=:B1)
  12 - filter(ROWNUM=:SYS_B_17)
  13 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_16)
  14 - access("ENL_OBJECT_ID"=:B1)
  15 - filter(ROWNUM=:SYS_B_21)
  16 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_20)
  17 - access("ENL_OBJECT_ID"=:B1)
  18 - filter(ROWNUM=:SYS_B_23)
  19 - filter("ENL_EXCHANGE_NORM_ID"=:SYS_B_22)
  20 - access("ENL_OBJECT_ID"=:B1)
  22 - access("TIT_ID"=:B1)
  24 - filter("ROO_DROIT_COUNTRY_ID" IS NOT NULL)
  25 - access("ROO_ID"=:B1)
  27 - access("ROO_DROIT_COUNTRY_ID"="CRY_ID")
  33 - access("GRL_COMPTE_ID"="CTP_COMPTE_ID" AND "GRL_SLAVEINTERFACE_ID"="CTP_TITRE_ID")
       filter(("GRL_STARTDATE"<="LYX_DAY" AND ("GRL_STOPDATE" IS NULL OR "GRL_STOPDATE">="LYX_DAY")))
  34 - filter("POSITION"."CTP_POS_GLOBAL">:SYS_B_32)
  35 - access("POSITION"."LYX_DAY"=TO_DATE(:SYS_B_36,:SYS_B_37))
  36 - filter("GRL_STARTDATE"<=TO_DATE(:SYS_B_36,:SYS_B_37))
  37 - filter("GRL_MASTERINTERFACE_ID"<>:SYS_B_27)
  38 - access("GRL_ID"="GRL_ID")
  39 - filter(("VCOMP"."ROO_FUND_ID"<>:SYS_B_33 AND "VCOMP"."ROO_FUND_ID"<>:SYS_B_34 AND "VCOMP"."ROO_FUND_ID"<>:SYS_B_35))
  40 - access("VCOMP"."ROO_ID"="GRL_MASTERINTERFACE_ID")
       filter(("VCOMP"."ROO_ID"<>:SYS_B_27 AND "VCOMP"."ROO_ID"<>:SYS_B_28 AND "VCOMP"."ROO_ID"<>:SYS_B_29 AND "VCOMP"."ROO_ID"<>:SYS_B_30 AND
              "VCOMP"."ROO_ID"<>:SYS_B_31))
  42 - access("VFUNDSHARES"."ROO_ID"="GRL_SLAVEINTERFACE_ID")
  46 - access("SER_ID"="VFUNDSHARES"."ROO_ID")
  47 - access("MFC_ID"="VFUNDSHARES"."ROO_ID")
  49 - access("DEVISE"."DEV_ID"="VFUNDSHARES"."ROO_DEVISE_ID")

Le résultat est impressionnant: la requête s'exécute en un peu plus de 4 secondes et n'a généré que 122 000 logical reads au lieu de 24 millions avec le plan précédent. On note surtout que les bitmap conversions ont disparus du plan.

J'ai corrigé cette requête en production en ajoutant un hint OPT_PARAM permettant de désactiver le paramètre caché "_B_TREE_BITMAP_PLANS" uniquement au niveau de ma requête. J'évite ainsi d'impacter les plans des autres requêtes de ma session. J'ai rencontré récemment sur une autre requête de la même base le phénomène inverse où le CBO alternait entre 2 plans selon les jours. Le bon plan était celui qui utilisait la conversion à la volée de certains index b-tree. C'est pour cela que je déconseille fortement la désactivation au niveau de l'instance de ce paramètre caché, à moins bien sûr que vous ayez des raisons valables émanant notamment du support Oracle et que les éventuels régressions au niveau des plans aient été testées comme il se doit.

Pour info voici la syntaxe pour désactiver un paramètre via le hint OPT_PARAM:
/*+ OPT_PARAM('_b_tree_bitmap_plans' 'false') */

1 commentaire: