본문 바로가기
SQL/Oracle

만능인줄 알았던 오라클(잘되던 insert select 안될때)

by Pendine 2021. 8. 3.
728x90

오라클 DB에 대한 신뢰성을 꽤나 흔들리게 해주었던 쿼리

 

Insert select

 

여러개의 조건따윈 없고

이력성 테이블에 넣은 데이터들을 이용해서

스케줄러 돌아가는 시간에 맞춰서

매번 시간값 하나 넣어주면

다 해결되도록 쿼리를 짜놨었는데

 

이것 때문에 당황한일이 있었다.

(당황 => 하루이내에 수시간내로 원인파악 및 대처하여 처리 가능했던일)

 

예를 들어 A라는 마트에서는

여러가지의 상품들을 취급하는데

각각의 팔린 상품들이 팔린상품들을 관리하는 A.selled 라는 테이블이 있다고 치자.

 

여기서 B.record , C.record , ... 라는 테이블에 각각의 상품들이 얼마나 팔렸는지

매 시간과 일별 통계를 내는 데

 

각각의 모든 상품들을 아이디를 넣기보다 DB에서 처리하는게 더 빠르지 않을까 라는 생각으로

매 스케줄러에 돌아가는 시간일때마다 그 시간만 넣어주면 모든게 처리되도록 쿼리를 작성했었는데

 

그게 아니었다.

각각의 상품아이디와 시간으로 좀더 세분화 해주니 문제가 해결됐다..

 

이 문제가 해결되면서 그동안 다른곳에서 발생했던 DB문제도 해결이 된 듯하다..

 

분명 처음 서버가 돌아갈때는 아무 문제가 없었기 때문에 잘 돌아가는구나 확인하고 넘어갔었는데

이번에 가서 확인해보니 DB테이블스페이스나 인덱스 테이블 스페이스가

95%, 97% 가량 가용중이었기 때문이라고도 생각되지만

일단 눈에 띄도록 해결되서 다행.

 

이번문제 덕분에 당일치기로 끝났어야 했던 일이 하루 더 걸렸다.

그래도 주말전에 완벽히 해결되서 다행.

 

------------------------------------------------

문제 및 원인 파악방법 과 해결 방법 요약.

 

1. 문제

통계가 생성되어야하는데

매번 생성되는 주기가 이상하다

=> 5분마다 생성되어야하는 통계가 불특정한 주기로 누락된다.

정상 : 0분(정각) 5분 10분 15분 20분 25분 , ....

현재 : 5분 10분 25분 45분 55분 등...

 

2. 원인 파악

현재까지의 데이터가 쌓인 테이블 A.selled에서 사용하고 있던 쿼리를 계속 입력한다.

Insert Select 를 구문을 전체적으로 이용한다.

정상적으로 작동함 -> ??

계속 입력한다 -> 어느순간 안됨.

(DB 테이블이 락이 걸렸는지 확인하기 위해 안되는동안 다른 클라이언트를 통해서

해당 테이블을 select 쿼리를 이용하여 확인 -> 정상작동 -> ???)

 

이번엔 select의 부분만 계속 쿼리한다.

정상적으로 작동함 -> ??

계속 입력한다 -> 어느순간 안됨 -> ?!

(DB 테이블이 락이 걸렸는지 확인하기 위해 안되는동안 다른 클라이언트를 통해서

해당 테이블을 select 쿼리를 이용하여 확인 -> 정상작동 -> ???)

 

이번엔 조건을 조금 상세하게 취급하여 쿼리를 한다.

정상적으로 작동함 -> ㅇㅇ 당연

계속 입력한다 -> 계속 작동함.

 

아 SQL이 무거운가보다 -> 바꾼 sql이 보다 최적화된 구문이라고 파악하고 변경 후 적용

 

3. 기존에 돌리던 로직과 비교하기위해 일정시간동안 구동하여

이전에 발생했던 오류가 동일하게 발생하는지 확인

-> 없음 => 원인해결.

728x90

댓글