2017-03-21 1 views
0

역 달력을 만들려고합니다. 그것은 정상 날짜와 함께 제공 될 때, 예를 들어 월말과 어떤 날짜인지 구별 할 수 있습니다.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을 코드를 복제 시도 나는 그것에 대해 아주 새롭거나 의도 한대로 합류 작업을하기 때문에.

+0

MySQL이 아닌 PL/SQL = Oracle입니다. –

+0

예. 나는 MySQL에서 성공했지만 지금은 오라클에서도 똑같이하려고합니다. 하지만 그렇게하지 못합니다. – Pokis

+1

예제에는 PL/SQL 코드가 없습니다. 느린 SQL 쿼리를 처리하고 있으며이를 처리하려면 실행 계획을 세워야합니다. 대부분의 경우,'t_calendar'는 꽤 크고 사용할 수있는 인덱스가 부족합니다. 그러나 그것은 단지 추측입니다. –

답변

2

두 번째 및 세 번째 코드 단편은 첫 번째 코드 단편과 동일한 논리를 수행하지 않습니다. (오라클의 프로 시저 언어하지 PL/SQL) 오라클 SQL에서 1 조각에 상응하는 것 :

UPDATE t_calendar a 
SET (inverse_day, inverse_week_of_month) = 
( SELECT max(b.day) - a.day + 1, TRUNC((max(b.day) - a.day)/7) + 1 
    FROM t_calendar b 
    WHERE b.year = a.year 
    AND b.month = a.month 
) u 

이 같은 t_calendar에 인덱스가 아마 너무 도움이 될 것이다 :

CREATE INDEX ON t_calendar (year, month, day desc) 

죄송합니다. 구문 오류 등을 확인하기 위해 Oracle 데이터베이스 앞에 있지 않습니다.

+0

믹스 업에 나쁘다. 이 작업이 효과가 있음을 명확히 밝히고 싶었지만 인덱싱을 사용하지 않아도 실제로 문제가 해결 된 인덱싱이 아직까지도 수 분 정도 걸립니다. 그러나이 구현은 여전히 ​​동일한 방식으로 작동하지만 이전에 사용한 것보다 읽기 쉽습니다. – Pokis