Oracle запрос на поиск записей занял более 24 часов для обработки - PullRequest
0 голосов
/ 06 апреля 2020

У меня возникла ситуация, когда мне нужно было найти такие записи из таблиц, которые загружаются в DW более 24 часов.

, поэтому для этого у меня есть две таблицы

  1. Таблица 1: - Которая содержит статистику о каждой загрузке
  2. Таблица 2: - Которая содержит статистику о том, когда мы получили каждый файл для загрузки

Теперь я хочу только те записи, которые заняли более 24 часов для загрузки. Дата получения файла указана в таблице 2, тогда как после завершения загрузки в таблице 1 таблица 2 может иметь более 1 записей для каждого файла.

Я разработал приведенный ниже запрос, но он занимает больше времени

SELECT 
    rcd.file_date,
    rcd.recived_on as "Date received On",
    rcd.loaded_On "Date Processed On",
    to_char(rcd.recived_on,'DY') as "Day",
    round((rcd.loaded_On - rcd.recived_on)*24,2) as "time required"
FROM (
    SELECT 
        tbl1.file_date,
        (SELECT tbl2.recived_on 
         FROM ( SELECT recived_on 
                FROM table2 
                Where fileName = tbl1.feedName 
                order by recived_on) tbl2 
          WHERE rownum = 1) recived_on,
        tbl1.loaded_On,  
        to_char(tbl2.recived_on,'DY'), 
        round((tbl1.loaded_On - tbl2.recived_on)*24,2)
    FROM Table1 tbl1 ,
         Table1 tbl2
    WHERE
        tbl1.id=tbl2.id 
        AND tbl1.FileState = 'Success'
        AND trunc(loaded_On) between '25-Feb-2020' AND '03-Mar-2020' 
) rcd
WHERE (rcd.loaded_On - rcd.recived_on)*24 > 24;


1 Ответ

0 голосов
/ 06 апреля 2020

Я думаю, что большая часть вашей проблемы, скорее всего, связана с использованием подзапроса в списке столбцов вашего внутреннего запроса. Возможно, вместо этого попробуйте использовать функцию analyti c. Примерно так:

SELECT rcd.file_date,
       rcd.recived_on AS "Date received On",
       rcd.loaded_On "Date Processed On",
       to_char(rcd.recived_on, 'DY') AS "Day",
       round((rcd.loaded_On - rcd.recived_on) * 24, 2) AS "time required"
FROM   (SELECT tbl1.file_date,
               MIN(tbl2.recived_on) OVER (PARTITION BY tbl2.filename) AS recived_on,
               tbl1.loaded_On
        FROM   Table1 tbl1
        INNER JOIN Table1 tbl2 ON tbl1.id = tbl2.id
        WHERE    tbl1.FileState = 'Success'
        AND      trunc(loaded_On) BETWEEN '25-Feb-2020' AND '03-Mar-2020') rcd
WHERE  (rcd.loaded_On - rcd.recived_on) * 24 > 24;

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

...