Нужно руководство по переписыванию этого запроса - PullRequest
0 голосов
/ 28 марта 2019

Текущий сценарий => У нас есть запрос, который мы выполняем в нашем кластере продуктов.этот запрос выбирает только 3 поля из объединения между 1 таблицей и (вложенным способом объединения) другой огромной таблицы, а затем выполняет групповую обработку в конце, но выполняется в течение 2 часов на производстве и попадает в одну огромную таблицу в этом объединении

Запрос:

INSERT OVERWRITE TABLE mstr_wrk.final_acct_data 
    SELECT
       a0,
       a1,
       a2,
       a3 
    FROM
                   (
                  SELECT
                 t1.a0 as a0 
                  FROM
                 (
                    SELECT
                       t1.a0 as a0 
                    FROM
                       (
                      SELECT
                         CAST(t1.acct_id AS STRING) as a0 
                      FROM
                         mstr_wrk.cust_xref t1
                       )
                       t1 
                    GROUP BY
                       t1.a0
                 )
                 t1
               )
       tab1 
       RIGHT OUTER JOIN
              (
             SELECT
              a0,
              a1,
              a2 
             FROM
                (
                   SELECT
        (
                  CASE
                     WHEN
                    1 = t1.a1 
                     THEN
                    t1.a0 
                     ELSE
                    CAST(NULL AS TIMESTAMP) 
                  END
        ) as a0, UDFcalldate('TRUNC', UDFcalldate('ADD_TO_DATE', 
                  (
                     CASE
                    WHEN
                       1 = t1.a1 
                    THEN
                       t1.a0 
                    ELSE
                       CAST(NULL AS TIMESTAMP) 
                     END
                  )
        , 'D', - 1), 'DD') as a1 
                   FROM
                  (
                     SELECT
                    MAX(t1.a0) as a0,
                    MAX(t1.a1) as a1 
                     FROM
                    (
                       SELECT
                          load_audit.run_ts as a0,
                          1 as a1 
                       FROM
                          mstr_wrk.load_audit 
                       WHERE
                          val_name = 'card_stg'
                    )
                    t1
                  )
                  t1
                )
                tab4 
                JOIN
                   (
                  SELECT
                     CAST(t1.acct_cd AS STRING) as a0,
                     CAST(t1.h_acct_cd AS STRING) as a1,
                     CAST(t1.acct_num AS STRING) as a2,
                     CAST(t1.load_dt AS TIMESTAMP) as a3,
                     t1.ts as a4 
                  FROM
                     mstr_work.acct_crd t1
                   )
                 tab3 
             WHERE
                (
                   tab4.a0 < tab3.a4
                )
                AND 
                (
                   tab4.a1 <= tab3.a3
                )
              )
          tab2 
          ON (tab1.a0 = tab2.a1) 
    WHERE
       1 = 
       (
          CASE
         WHEN
            tab1.a0 IS NULL 
         THEN
            1 
         ELSE
            0 
          END
       )
    GROUP BY
       tab2.a0, tab2.a1, tab2.a2

То, что я пробовал - я пытался включить CBO и векторизацию вместе с ppd, но не повезло, я не вижу здесь никакой маленькой таблицы, поэтому не могу попробовать соединение со стороной карты Одно из объединений, которое выглядиткак перекрестное объединение может быть переведено во внутреннее объединение, но в любом случае я могу попробовать CTE здесь

Запрос - пожалуйста, руководство, как я могу это исправить, есть ли лучший способ переписать этот запрос.

...