Oracle: Как повысить уровень запроса, удалив подзапрос в условия или присоединившись к той же таблице? - PullRequest
1 голос
/ 10 июля 2020

У меня есть представление под названием Employee_All.

Это приносит данные из двух (от одной до многих) таблиц с помощью соединения, где несколько записей помещаются в одну строку и отображаются у всех сотрудников. One имеет 30000 записей, а many имеет удвоение до One.

Следующие простые запросы: 1 se c для возврата 50 записей

SELECT x.*, (SELECT 'NOIFS' FROM DUAL) as TYPE  FROM Employee_ALL x 

Когда я добавляю условие и он возвращает 50 записей за 1,81 секунды

SELECT x.*, (SELECT 'NOIFS' FROM DUAL) as TYPE  FROM Employee_ALL x 
WHERE (x.endDate > sysdate-90 OR x.endDate is null) OR x.lastUpdated >= sysdate-30
fetch first 50 rows only

Теперь есть подзапрос, и он возвращает 50 записей за: 4,14 секунды

SELECT x.*, (SELECT USERID FROM Employee_ALL z WHERE UPPER(EMPLOYEEID)=x.leaderEmployeeId ) as managersuserid, (SELECT 'NOIFS' FROM DUAL) as TYPE  
FROM Employee_ALL x 
WHERE (x.endDate > sysdate-90 OR x.endDate is null) OR x.lastUpdated >= sysdate-30
fetch first 50 rows only

Есть ли способ настроить последний запрос таким образом что он возвращает результаты за секунды, поскольку мне нужно запустить этот запрос для 30 000 записей? (Загрузка данных занимает около 10-15 минут) любое другое предложение

Примеры данных, например:

EmpID ManagerEmpID NAME            UserID
1       2          Harry           Har
2                  Garry Manager   Gar
3       2          Cherry          Char

1 Ответ

0 голосов
/ 10 июля 2020

Без понимания всей модели данных и ожидаемых результатов это довольно сложно. Я бы использовал этот запрос:

SELECT x.* , 
case when UPPER(x.EMPLOYEEID)=z.leaderEmployeeId then z.userid else null end 
as managersuserid, 
'NOIFS' as TYPE  
FROM Employee_ALL x left join Employee_ALL z on ( x.EMPLOYEEID = z.EMPLOYEEID ) 
WHERE (x.endDate > sysdate-90 OR x.endDate is null) OR x.lastUpdated >= sysdate-30

Используя ваш пример модели данных, я построю это

SQL> create table Employee_ALL ( EMPLOYEEID number, managerempid number, name varchar2(100) , userid varchar2(100) );

insert into Employee_ALL  values ( 1 ,2 , 'Harry' , 'Har' );
insert into Employee_ALL  values ( 2 ,null , 'Robert' , 'Rob' );
insert into Employee_ALL  values ( 3 ,null , 'Jim' , 'Jim' );
insert into Employee_ALL  values ( 4 ,2 , 'Frank' , 'Fra' );
Table created.

SQL> SQL>
1 row created.

SQL>
1 row created.

SQL>
1 row created.

SQL>

1 row created.

SQL> commit;

SQL> alter table Employee_ALL add end_date date ;

Table altered.

SQL> update Employee_ALL set end_date = sysdate where EMPLOYEEID = 1 ;

update Employee_ALL set end_date = sysdate - 91 where employeeid = 4;

update Employee_ALL set end_date = sysdate where end_date is null;
1 row updated.

SQL> SQL>
1 row updated.

SQL> SQL>

2 rows updated.

SQL> commit;

Commit complete.

 SELECT x.* ,
  2        case when UPPER(x.EMPLOYEEID)=z.ManagerEmpID then z.userid else null end as managersuserid,
  3       'NOIFS' as TYPE
  4  FROM Employee_ALL x left join Employee_ALL z on ( x.EMPLOYEEID = z.EMPLOYEEID )
  5* WHERE (x.end_date > sysdate-90 OR x.end_date is null)

EMPLOYEEID MANAGEREMPID NAME       USERID     END_DATE MANAGERSUS TYPE
---------- ------------ ---------- ---------- -------- ---------- -----
         1            2 Harry      Har        20200710            NOIFS
         2              Robert     Rob        20200710            NOIFS
         3              Jim        Jim        20200710            NOIFS

SQL>

Если я обновлю поле менеджера

SQL> update Employee_ALL set MANAGEREMPID=2 where employeeid=2 ;

1 row updated.

SQL> commit;

Commit complete.

SQL>  SELECT x.* ,
       case when UPPER(x.EMPLOYEEID)=z.ManagerEmpID then z.userid else null end as managersuserid,
      'NOIFS' as TYPE
 FROM Employee_ALL x left join Employee_ALL z on ( x.EMPLOYEEID = z.EMPLOYEEID )
 WHERE (x.end_date > sysdate-90 OR x.end_date is null)
 /  2    3    4    5    6

EMPLOYEEID MANAGEREMPID NAME       USERID     END_DATE MANAGERSUS TYPE
---------- ------------ ---------- ---------- -------- ---------- -----
         1            2 Harry      Har        20200710            NOIFS
         2            2 Robert     Rob        20200710 Rob        NOIFS
         3              Jim        Jim        20200710            NOIFS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...