Войти

Показать полную графическую версию : Как оптимизировать громоздкий запрос sql ?


АлександЕР21
11-07-2018, 09:14
select
t1.DDATES,
initcap(to_char(t1.DDATES,'DAY','NLS_DATE_LANGUAGE=RUSSIAN')) P_D_RUS,

((SELECT NULL FROM DUAL)
||'['||
(SELECT COUNT (*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE trunc(PLAN_DATE)=trunc(t1.DDATES) AND PAYMENT_KIND_ID in (20319110, 24439460, 21178087, 33232, 33233))
||']'||
(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE trunc(PLAN_DATE)=trunc(t1.DDATES) AND PAYMENT_KIND_ID=20319110
AND nvl(HOSP_HISTORY_DS,0) = 0 )
||'/'||(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE trunc(PLAN_DATE)=trunc(t1.DDATES) AND PAYMENT_KIND_ID=24439460
AND nvl(HOSP_HISTORY_DS,0) = 0 )
||'/'||(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE trunc(PLAN_DATE)=trunc(t1.DDATES) AND PAYMENT_KIND_ID=21178087
AND nvl(HOSP_HISTORY_DS,0) = 0 )
||'/'||(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE trunc(PLAN_DATE)=trunc(t1.DDATES) AND PAYMENT_KIND_ID=33232
AND nvl(HOSP_HISTORY_DS,0) = 0 )
||'/'||(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE trunc(PLAN_DATE)=trunc(t1.DDATES) AND PAYMENT_KIND_ID=33233
AND nvl(HOSP_HISTORY_DS,0) = 0 ))

as DAY_TOTAL,


-- НО-1

((SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD where trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy') and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy')
AND HOSP_PLAN_KIND=75600447 AND nvl(HOSP_HISTORY_DS,0) = 0 /*AND RECORD_STATUS = 1 AND DEP_ID is not null*/
AND PAYMENT_KIND_ID in (20319110, 24439460, 21178087, 33232, 33233))
||' ('||
(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE HOSP_PLAN_KIND=75600447 and trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy')
and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy') AND PAYMENT_KIND_ID=20319110 AND nvl(HOSP_HISTORY_DS,0) = 0 /*AND RECORD_STATUS = 1 AND DEP_ID is not null*/)
||'/'||
(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE HOSP_PLAN_KIND=75600447
and trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy') and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy') AND PAYMENT_KIND_ID=24439460 AND nvl(HOSP_HISTORY_DS,0) = 0 /*AND RECORD_STATUS = 1 AND DEP_ID is not null*/)
||'/'||
(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE HOSP_PLAN_KIND=75600447 and trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy')
and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy') AND PAYMENT_KIND_ID=21178087 AND nvl(HOSP_HISTORY_DS,0) = 0 /*AND RECORD_STATUS = 1 AND DEP_ID is not null*/)
||'/'||
(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE HOSP_PLAN_KIND=75600447 and trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy')
and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy') AND PAYMENT_KIND_ID=33232 AND nvl(HOSP_HISTORY_DS,0) = 0 /*AND RECORD_STATUS = 1 AND DEP_ID is not null*/)
||'/'||
(SELECT COUNT(*) FROM D_V_HPK_PLAN_JOURNALS_ADD WHERE HOSP_PLAN_KIND=75600447 and trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy')
and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy') AND PAYMENT_KIND_ID=33232 AND nvl(HOSP_HISTORY_DS,0) = 0 /*AND RECORD_STATUS = 1 AND DEP_ID is not null*/)||')'

) as NO_1_TOTAL


from
table (cast (d_pkg_dat_tools.DATES_IN_RANGE(to_date('01-07-2018', 'dd-mm-yyyy'),to_date('31-07-2018', 'dd-mm-yyyy'),1) as D_CL_DATE)) t1
order by t1.DDATES


Выкладываю кусок кода т.к весь запрос состоит из 6 кусков кода ,включая вложенные подзапросы.
Запрос выполняется оч.долго, коллеги которые работают в программе с этим отчетом просто вешаются,когда он формируется по 10 минут
Вопрос, как убрать подзапросы или как мне его правильно оптимизировать ?

y--
11-07-2018, 11:05
АлександЕР21,
Правильно будет пожалуй переписать с нуля.
А оптимизировать можно разными способами... Ну например:
trunc(plan_date) >= to_date('01-07-2018', 'dd-mm-yyyy') and trunc(plan_date) <= to_date('31-07-2018', 'dd-mm-yyyy')по результату эквивалентноtrunc(plan_date, 'MONTH') = to_date('01-07-2018', 'dd-mm-yyyy')а время выполнения будет заметно отличаться...

АлександЕР21
11-07-2018, 11:24
y--, Правильно будет пожалуй переписать с нуля. » Готов переписать с нуля только вот не знаю с чего начать ,дайте направление пжлст. ЧТо нужно использовать UNION ALL ? Каким образом мне написать правильный и грамотный запрос ?

y--
11-07-2018, 12:15
АлександЕР21,
Использование UNION ALL на относительно небольшой по общему объему итоговой выборке вполне оправдано. Главное следить чтобы все объединяемые выборки совпадали по структуре.
Каким образом мне написать правильный и грамотный запрос ? »Начинают всегда от печки - постановка задачи наше все!
И по-ходу надо бы замеры производительности подвложенных кусков существующего решения оценить - чтобы понять где торможение.




© OSzone.net 2001-2012