Представление проблемы производительности с DENSE_RANK () в оракуле - PullRequest
0 голосов
/ 18 марта 2019

У нас есть требование получить записи из приведенных ниже таблиц с указанным условием сопоставления и ограничить счет UNIQUE COL3 до 20K.

Мы достигли этого с помощью логики DENSE_RANK(), но мы наблюдали очень медленнуюв производительности, когда мы внедрили в живую систему.

Для обработки 20K UNIQUE COL3 и 60K итоговых записей требуется 14-15 часов (процесс выполняется на ежедневной JOB и выбирается из режима просмотра и выполненияОперация DML для нескольких таблиц на основе записей View).

SELECT COUNT (distinct COL3) CNT1,COUNT(1) CNT2 FROM VW_ENTP;
--20,000                                                  60,000

Без логика DENSE_RAN() завершается очень быстро, но с DENSE_RAN() она чрезвычайно медленная.

Запросите вашу помощь, чтобы поделиться любой рекомендацией по УЛУЧШЕНИЮ QUERY PERFORMANCE или любым другим подходом.Заранее благодарим!

Пример кода

CREATE OR REPLACE VIEW VW_ENTP(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10) AS
SELECT
COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10
 FROM
(
SELECT
           NP.NFCD COL1,
           D.CLO2 COL2,
           NP.COL3 COL3,
           E.COL4 COL4,
           EDT.COL5,
           EDT.COL6,
           NP. COL7,
           NP. COL8,
           EDT.COL9 COL9,
           NP.COL10,
           DENSE_RANK() OVER (ORDER BY NP.COL3) RANK
  FROM ENP NP,EDTS EDT,EM E,EDT D,BDT BD
WHERE EDT.COL2=D.COL2
  AND E.COL3=NP.COL3
  AND E.COL7=NP.COL7
  AND E.COL8=NP.COL8
  AND E.APP=NP.APP
  AND NP.STATUS='P'
  AND NP.NFCD=D.COL1
  AND E.SUSP !='YES'
  AND NP.APP='EDOC'
  AND TRUNC(NP.RC_DATE)<=TRUNC(BD.LAST_RUN_DATE)
)
  WHERE RANK<=20000;

Примечание. Используемые выше столбцы индексируются.

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

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

Чтобы подтвердить, что проблема связана с плотным рангом, вы можете удалить ее и выполнить оператор выбора.Если это занимает меньше времени, вы можете сделать вывод, что проблема связана с плотным рангом.Но я очень подозреваю, что это произойдет.

0 голосов
/ 18 марта 2019

Этого можно добиться только с помощью функции row_number ():

CREATE OR REPLACE VIEW VW_ENTP(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10) AS
SELECT
COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10
 FROM
(select a.*, row_number() over (order by col3) rn from (
SELECT
           NP.NFCD COL1,
           D.CLO2 COL2,
           NP.COL3 COL3,
           E.COL4 COL4,
           EDT.COL5,
           EDT.COL6,
           NP. COL7,
           NP. COL8,
           EDT.COL9 COL9,
           NP.COL10,
           row_number() OVER (partition by np.col3 ORDER BY NP.COL3) RANK
  FROM ENP NP,EDTS EDT,EM E,EDT D,BDT BD
WHERE EDT.COL2=D.COL2
  AND E.COL3=NP.COL3
  AND E.COL7=NP.COL7
  AND E.COL8=NP.COL8
  AND E.APP=NP.APP
  AND NP.STATUS='P'
  AND NP.NFCD=D.COL1
  AND E.SUSP !='YES'
  AND NP.APP='EDOC'
  AND TRUNC(NP.RC_DATE)<=TRUNC(BD.LAST_RUN_DATE)
) a where rank > 1 and rank <= 20000) 

;

Результаты текущего запроса:

COL3 RANK

1 1

2 1

3 1

3 2

3 3

3 4

4 1

5 1

Требование:

COL3 RANK

1 1

2 2

3 3

3 3

3 3

3 3

4 4

5 5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...