Ускорить оракул SQL-запрос - PullRequest
       13

Ускорить оракул SQL-запрос

0 голосов
/ 06 февраля 2019

У меня есть запрос, который я пытаюсь оптимизировать, для выполнения которого требуется 6 минут (DS1 имеет 200 тыс. Строк и DS2 200 тыс. Строк).Мне было интересно, есть ли какие-нибудь оптимизации, которые может видеть гуру оракула?Я ни в коем случае не эксперт, скорее любитель ... проблема в том, что групповая часть занимает больше всего времени ...

WITH DS1 AS
  (SELECT
    /*+ PARALLEL */
    *
  FROM PD1
  WHERE TYPE      = 'TSY'
  AND SOURCE = 'A'
  ),
  DS2 AS
  (SELECT
    /*+ PARALLEL */
    *
  FROM PD1
  WHERE TYPE     = 'LGL'
  AND SOURCE = 'B'
  ),
  Q AS
  (SELECT DS1.ID  AS DS1_ID,
    DS1.CODE  AS DS1_CODE,
    DS2.CODE  AS DS2_CODE,
    DS2.ID        AS DS2_ID,
    DS1.TYPE        AS TYPE1,
    DS2.TYPE        AS TYPE2,
    DS1.SOURCE AS SS1,
    DS2.SOURCE AS SS2,
    DS1.ATTRIBUTE,
    DS1.ATTRIBUTE_VAL,
    DS1.ATT_AND_VAL
  FROM DS1
  JOIN DS2
  ON DS1.ATT_AND_VAL = DS2.ATT_AND_VAL
  ) ,
  GROUPINGS AS
  (SELECT
    /*+no_merge */
    DS1_ID                  AS BASE_ID ,
    DS1_CODE               AS BASE_CODE,
    DS2_CODE               AS TARGET_CODE,
    COUNT(DISTINCT(DS2_ID)) AS COUNT_OF_TARGET_ID
  FROM Q
  GROUP BY DS1_ID,
    DS1_CODE,
    DS2_CODE
  )
SELECT *
FROM GROUPINGS
ORDER BY BASE_ID,
  BASE_CODE,
  TARGET_CODE;

1 Ответ

0 голосов
/ 06 февраля 2019

Я хотел бы просто упростить существующий запрос, удалив все общие табличные выражения и подсказки.Например:

SELECT
    DS1_ID                     AS BASE_ID
  , DS1_CODE                   AS BASE_CODE
  , DS2_CODE                   AS TARGET_CODE
  , COUNT( DISTINCT (DS2_ID) ) AS COUNT_OF_TARGET_ID
FROM (
    SELECT
        DS1.ID     AS DS1_ID
      , DS1.CODE   AS DS1_CODE
      , DS2.CODE   AS DS2_CODE
      , DS2.ID     AS DS2_ID
    FROM PD1 DS1
    JOIN PD1 DS2 ON DS1.ATT_AND_VAL = DS2.ATT_AND_VAL
                AND DS2.TYPE = 'LGL'
                AND DS2.SOURCE = 'B'
    WHERE DS1.TYPE = 'TSY'
    AND DS1.SOURCE = 'A'
    ) Q
GROUP BY
    DS1_ID
  , DS1_CODE
  , DS2_CODE
ORDER BY
    BASE_ID
  , BASE_CODE
  , TARGET_CODE
;

Если для запуска требуется несколько минут, я бы посоветовал вам добавить индексы.Первое, что нужно сделать, это получить план объяснения, чтобы определить, используются ли какие-либо индексы для сужения следующих шагов.

...