역 달력을 만들려고합니다. 그것은 정상 날짜와 함께 제공 될 때, 예를 들어 월말과 어떤 날짜인지 구별 할 수 있습니다.pl/sql과 msql 조인, 성능 저하
t_calendar는 내가 사용하는 임시 캘린더이지만 그 날짜는 있습니다. 그러나이를 업데이트하고 inverse_day 및 inverse_week_of_month 열을 역으로 설정하고 싶습니다.
나는 다음과은 mSQL에 그렇게 succeded :
UPDATE @t_calendar
SET inverse_day = b.max_day_of_month - a.day + 1,
inverse_week_of_month = (b.max_day_of_month - a.day)/7 + 1
FROM @t_calendar a
INNER JOIN (SELECT year, month, MAX(day) max_day_of_month FROM @t_calendar GROUP BY year, month) b ON b.year = a.year AND b.month = a.month;
그리고 PL/작동은 다음과 SQL에서 유사했다 :
UPDATE t_calendar a
SET inverse_day = customDate1.max_day - a.day + 1,
inverse_week_of_month = TRUNC((customDate1.max_day - a.day)/7) + 1
WHERE customDate1.year = a.year AND customDate1.month = a.month;
을 그러나 것을 매우 느립니다 MSQL이 2 초 걸린다면 pl/sql은 몇 분이 걸릴 것입니다. 그래서 이것은 내가 생각하기에 좋은 해결책이 아닙니다. ,
UPDATE t_calendar
SET (inverse_day, inverse_week_of_month) = (
SELECT b.max_day_of_month - a.day + 1, TRUNC((b.max_day_of_month - a.day)/7) + 1
FROM t_calendar a
inner JOIN (SELECT year, month, MAX(day) max_day_of_month FROM t_calendar GROUP BY year, month) b
ON b.year = a.year AND b.month = a.month
where rownum <= 1);
가 어떤 방법으로 내가 PL/SQL이를 최적화 할 수 있습니다 나는 실패 내 단위 테스트로, 이전과 동일한 방식으로 작동하지 않는 것 PL/SQL,에 mSQL을 코드를 복제 시도 나는 그것에 대해 아주 새롭거나 의도 한대로 합류 작업을하기 때문에.
MySQL이 아닌 PL/SQL = Oracle입니다. –
예. 나는 MySQL에서 성공했지만 지금은 오라클에서도 똑같이하려고합니다. 하지만 그렇게하지 못합니다. – Pokis
예제에는 PL/SQL 코드가 없습니다. 느린 SQL 쿼리를 처리하고 있으며이를 처리하려면 실행 계획을 세워야합니다. 대부분의 경우,'t_calendar'는 꽤 크고 사용할 수있는 인덱스가 부족합니다. 그러나 그것은 단지 추측입니다. –