Как уменьшить время отклика Oracle - PullRequest
0 голосов
/ 06 декабря 2018

Приведенный ниже запрос работает нормально, за исключением времени ответа, для извлечения записей потребуется 4 секунды, мне нужно знать лучшие практические советы, чтобы написать то же самое, поэтому время выполнения запроса улучшится.

SELECT name,loc_id,tot_emp,net_salary,gross_earn,gross_deduct,case WHEN YEAR_MONTH IS NOT NULL THEN YEAR_MONTH ELSE 'NA' END AS Month
FROM
--SELECT * FROM 
(SELECT  
r.NAME, 
'000' loc_id,
COUNT(DISTINCT ess.employee_id) tot_emp,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.net_salary else 0 end) net_salary,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.gross_earning else 0 end) gross_earn,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.gross_deduction else 0 end) gross_deduct,
MAX(ess.YEAR_MONTH)YEAR_MONTH 
FROM Region r
JOIN EMPLOYEE e
ON r.REGION_ID=e.REGION_ID
LEFT JOIN EMPLOYEE_SALARY_SUMMARY ess
ON ess.EMPLOYEE_ID=e.EMP_ID
WHERE e.CIRCLE_ID IS NULL 
group by r.NAME, '000'
UNION 
SELECT 
c.name,
c.circle_id loc_id,
COUNT(DISTINCT ess.employee_id) tot_emp,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.net_salary else 0 end) net_salary,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.gross_earning else 0 end) gross_earn,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.gross_deduction else 0 end) gross_deduct,
MAX(ess.YEAR_MONTH)YEAR_MONTH
FROM circle c
JOIN EMPLOYEE e
ON c.CIRCLE_ID=e.CIRCLE_ID
LEFT JOIN EMPLOYEE_SALARY_SUMMARY ess
ON ess.EMPLOYEE_ID=e.EMP_ID 
group by c.name, c.circle_id
)mtybl
ORDER BY loc_id;

1 Ответ

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

Вы можете заменить объединение на объединения. Я внес некоторые изменения в приведенный выше запрос, чтобы проверить его со своими данными.Я использовал левые соединения, используя ссылку из вашего запроса, но попробуйте использовать внутренние соединения для повышения производительности.

SELECT name,loc_id,tot_emp,net_salary,gross_earn,gross_deduct,YEAR_MONTH
--SELECT * FROM 
(
SELECT  
r.NAME, 
CASE WHEN C.CIRCLE_ID IS NULL THEN '000' ELSE c.circle_id END loc_id,
COUNT(DISTINCT ess.employee_id) tot_emp,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.net_salary else 0 end) net_salary,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.gross_earning else 0 end) gross_earn,
SUM(CASE WHEN ess.employee_id IS NOT NULL  Then ess.gross_deduction else 0 end) gross_deduct,
CASE WHEN MAX(ess.YEAR_MONTH) IS NULL THEN 'NA' ELSE MAX(ess.YEAR_MONTH) END YEAR_MONTH
FROM EMPLOYEE e Region 
JOIN EMPLOYEE_SALARY_SUMMARY ess
ON ess.EMPLOYEE_ID = e.EMP_ID
LEFT JOIN Region r
ON r.REGION_ID=e.REGION_ID
LEFT JOIN circle c 
ON c.CIRCLE_ID = e.CIRCLE_ID
group by r.NAME, '000', c.circle_id
)mtybl
ORDER BY loc_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...