Оптимизация запросов [Oracle] - PullRequest
0 голосов
/ 05 декабря 2018

Как я могу оптимизировать производительность этого запроса?

SELECT Count(DISTINCT DT.id) 
FROM   pcwdeptrans DT 
       INNER JOIN pcwitemtotal IT 
               ON DT.id = IT.deposittransid 
       LEFT OUTER JOIN pcwdepreceipt DR 
                    ON DR.deposittransid = DT.id 
WHERE  (( ( DT.statecode IN ( :1, :2, :3, :4, 
                              :5, :6, :7, :8 ) 
             OR ( DT.statecode IN ( :9 ) 
                  AND IT.statecode = :10 ) ) 
          AND DR.requesttime >= :11 
          AND DR.requesttime <= :12 
          AND DR.userid = :13 )) 

Пожалуйста, помогите мне с правильным синтаксисом, если вы считаете его неправильным.

Но это запрос приложения, определенный изотчет AWR как часть анализа производительности

Выдержка из AWR:

Top SQL с TOP-событиями

План его выполнения из тестовой БД (быть другим):

План выполнения запроса

1 Ответ

0 голосов
/ 05 декабря 2018

Присоединяйтесь вместе с Где можно медленно.следующее может быть быстрее (но не то же самое ... смотрите комментарии и переосмыслите, если вам нужно внутреннее или внешнее соединение ...)

SELECT Count(DISTINCT DT.id) 
FROM pcwdeptrans DT 
  INNER JOIN pcwitemtotal IT 
      ON DT.id = IT.deposittransid 
     AND ( DT.statecode IN ( :1, :2, :3, :4, :5, :6, :7, :8 ) 
       OR ( DT.statecode IN ( :9 ) AND IT.statecode = :10 ) )
  LEFT OUTER JOIN pcwdepreceipt DR 
      ON DR.deposittransid = DT.id 
     AND DR.requesttime >= :11 
     AND DR.requesttime <= :12 
     AND DR.userid = :13

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

SELECT Count(DISTINCT DT.id) 
FROM pcwdeptrans DT 
  INNER JOIN pcwitemtotal IT 
      ON DT.id = IT.deposittransid 
     AND ( DT.statecode IN ( :1, :2, :3, :4, :5, :6, :7, :8 ) 
       OR ( DT.statecode IN ( :9 ) AND IT.statecode = :10 ) )
  INNER JOIN pcwdepreceipt DR 
      ON DR.deposittransid = DT.id 
     AND DR.requesttime >= :11 
     AND DR.requesttime <= :12 
     AND DR.userid = :13
...