대용량(?) 테이블 기간 조회 쿼리 튜닝 방법 질문드립니다.. 0 5 2,216

by 아이와사 [Oracle Tuning] 설계 대용량 테이블 쿼리 [2023.01.20 11:30:10]


안녕하세요. 

현재 주문테이블 - 범위 조회 쿼리가 느려서 튜닝을 해보고 싶은데 아직 지식이 부족해 질문드립니다.

 

# 현재 상태

데이터베이스는 오라클 입니다.

주문 (Transaction) 이라는 테이블이 있고 생성일 (CreateDate), 완료일 (CompleteDate) 컬럼이 있습니다.

생성일 컬럼은 파티셔닝 키로 설정되어 있고 YYYYMM 기준으로 분할하고 있습니다.

완료일 컬럼은 인덱스가 없는 상태입니다.

 

처음 주문이 생성될 때 생성일은 SYSDATE, 완료일은 NULL 로 입력됩니다.

추후 결제가 완료되면 UPDATE문을 이용해서 완료일에 값을 넣고 있습니다.

 

월 마다 완료된 주문 건 (완료일에 값이 있는 주문 건)에 대해 정산을 합니다.

범위 지정도 완료일 컬럼으로 하고, 정렬도 완료일 컬럼으로 해야 합니다.

완료일은 파티셔닝키도아니고 인덱스도 아니기에 속도가 매우 느립니다.

월별 데이터  N천만건입니다.

 

# 질문

주문, 정산 도메인이 있는 서비스가 많을 텐데 위와 같은 문제를 보통 어떻게 처리하는지 궁금합니다..

 

하위질문1.

완료일을 파티셔닝 키로 지정해도 될까요?

검색해보니 파티셔닝 키는 성능 이슈때문에 되도록 업데이트를 하지 않는게 좋다고 하여 질문드립니다..

 

하위질문2.

완료일을 인덱스로 지정하는건 어떨까요..? 각 엔티티마다 업데이트가 최대 1번 일어나는데 이슈가 생길만큼은 아닐까요..?

 

하위질문3.

테이블 분리도 생각해봤습니다..

성공처리되기전의 주문을 버퍼처럼 관리하는 테이블에 넣어두고 완료가 되면 메인 주문테이블로 옮기는..방법은 어떨까요?

 

 

작은 규모의 서비스만 다루다가 조금 규모있는 서비스를 처음 접하다보니 이런 저런 질문이 많네요..

긴 질문 읽어주셔서 감사합니다..!

 

 

 

by 우주민 [2023.01.20 15:45:07]

테이블의 수정이 힘든 상황이라면 인덱스 추가하는 방법이 제일 일반적일듯 합니다.

개인적으로는 결제완료 테이블을 생성해주는게 관리 면에서는 좋아 보이긴 하네요.


by 아이와사 [2023.01.25 09:16:22]

일단 인덱스만 생성하고 모니터링해봐야겠습니다..

답변 감사합니다.


by 우리집아찌 [2023.01.20 20:53:51]

쉽지 않을것 같네요.

인덱스 생성하면서 다른 SQL의 실행계획이 영향을 끼칠수 있으니 신중히 고민하시고 작업하셔야합니다.

조회조건에 완료일 만 있고 파티션키는 조건에 있나요?

정산 테이블 따로 만들어서 일배치로 갈수는 없나요?

월정산은 일정산 SUM하는 형태로요.

 

 

 


by 아이와사 [2023.01.25 09:21:27]

먼저 답변 감사합니다.

 

현재 파티션키가 생성일 컬럼으로 지정되어 있는데, 생성일과 완료일은 사실상 관계가 없다 보니 조건으로 지정하면 안는 상태입니다. (예를 들면 1월에 생성되고 2월~3월에 완료처리 되는 경우가 많습니다)

 

정산테이블이 별도로 있으나 가맹점에 청구할 때 상세 내역(주문목록)까지 같이 첨부해야해서 결국 범위조회를 해야하는 상황입니다.


by 우리집아찌 [2023.01.25 10:20:01]

완료일을 NULL 처리 안하고 PK에 추가하는 방법이 가능할까요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입