У меня есть два запроса для оптимизации, который долго работает в производстве. Я использовал все возможные индексы, представленные в таблицах. Какие-либо предложения? - PullRequest
0 голосов
/ 13 января 2019

Первый запрос для оптимизации: таблица ODS_SAMPLE содержит 100 миллионов записей, а таблица B содержит сотни тысяч записей.

INSERT /*+APPEND */ INTO TEMP_SAMPLE_00  NOLOGGING
(SELECT OBJEK,
       ATINN,
       ATZHL,
       MAFID,
       KLART,
       ADZHL,
       MAX(TST)   LST_DAT
     FROM ODS_SAMPLE A, PARAM B
    WHERE A.COD_ZON = 'P08'
        AND A.COD_ZON = B.COD_ZON
        AND B.COD_GEN_CLA = 'MAT'
         AND A.KLART = B.COD_TYP_CLA
    GROUP BY OBJEK, ATINN, ATZHL, MAFID, KLART, ADZHL); 

Второй запрос идет после первого. Объем данных, вставляемых в TEMP_SAMPLE_00, составляет около 80 миллионов строк.

INSERT /*+ APPEND */ INTO TEMP_SAMPLE_10 
    (SELECT
          A.OBJEK,
          A.ATINN,
          A.ATZHL,
          A.MAFID,
          A.KLART,
          A.ADZHL,
          A.ATWRT,
          A.ATFLV,
          A.ATAWE,
          A.ATFLB,
          A.ATAW1,
          A.ATCOD,
          A.ATTLV,
          A.ATTLB,
          A.ATPRZ,
          A.ATINC,
          A.ATAUT,
          A.AENNR,
          A.DATUV,
          A.LKENZ,
          A.ATIMB,
          A.ATZIS,
          A.ATSRT,
          A.ATVGLART
        FROM ODS_SAMPLE A, TEMP_SAMPLE_00 B
        WHERE A.OBJEK = B.OBJEK
          AND A.ATINN=B.ATINN
          AND A.ATZHL=B.ATZHL
          AND A.MAFID=B.MAFID
          AND A.KLART=B.KLART
          AND A.ADZHL=B.ADZHL
          AND (((A.TST = B.LST_DAT) AND (A.TST IS NOT NULL)) OR
                  (A.TST IS NULL))
          AND A.COD_ZON = 'P08');

Я пытался использовать предложение WITH на первом шаге, но время выполнения было почти таким же.

План выполнения ниже для первого запроса:

Plan hash value: 3884167348

--------------------------------------------------------------
| Id  | Operation                          | Name            |
--------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                 |
|   1 |  PX COORDINATOR                    |                 |
|   2 |   PX SEND QC (RANDOM)              | :TQ10002        |
|   3 |    HASH GROUP BY                   |                 |
|   4 |     PX RECEIVE                     |                 |
|   5 |      PX SEND HASH                  | :TQ10001        |
|   6 |       HASH GROUP BY                |                 |
|   7 |        HASH JOIN                   |                 |
|   8 |         BUFFER SORT                |                 |
|   9 |          PART JOIN FILTER CREATE   | :BF0000         |
|  10 |           PX RECEIVE               |                 |
|  11 |            PX SEND BROADCAST       | :TQ10000        |
|  12 |             VIEW                   | VW_GBF_9        |
|  13 |              HASH GROUP BY         |                 |
|  14 |               PARTITION LIST SINGLE|                 |
|  15 |                TABLE ACCESS FULL   | PARAM           |
|  16 |         PX BLOCK ITERATOR          |                 |
|  17 |          TABLE ACCESS FULL         | ODS_SAMPLE      |
--------------------------------------------------------------

А ниже для второй части:

Plan hash value: 3450208322

-------------------------------------------------
| Id  | Operation               | Name          |
-------------------------------------------------
|   0 | SELECT STATEMENT        |               |
|   1 |  PX COORDINATOR         |               |
|   2 |   PX SEND QC (RANDOM)   | :TQ10001      |
|   3 |    HASH JOIN            |               |
|   4 |     PX RECEIVE          |               |
|   5 |      PX SEND BROADCAST  | :TQ10000      |
|   6 |       PX SELECTOR       |               |
|   7 |        TABLE ACCESS FULL| TEMP_SAMPLE_00|
|   8 |     PX BLOCK ITERATOR   |               |
|   9 |      TABLE ACCESS FULL  | ODS_SAMPLE    |
-------------------------------------------------
...