팀내에서 지적사항이 나왔는데 자꾸 얘기가 챗바퀴처럼 돌아서 너무 답답해서 물어봄
1. 우선 현재 만들어야 하는 기능 설명
일단 14개 테이블에 평균 9000건 정도의 update가 필요한 상황임
먼저 특정 데이터가 쭉 들어오는데 이걸 14개 테이블에 넣기 위해 지지고 볶고 가공을 함
최종적으로 14개 리스트를 만들어서 각 테이블에 delete 후 insert하고 있음
전임자가 여기까지 코딩하고 퇴사한걸 내가 이어받은 상황
2. 문제가 된 상황
전임자가 코딩해 놓은게 트랜잭션 처리가 안돼 있음
중간에 뻑나면 데이터 정합성이 안맞을테니 14개 테이블 delete랑 insert하는거 전부 1개 트랜잭션으로 묶어 놓음
3. 지적 내용
근데 이걸 보더니 트랜잭션에 최대 크기가 있어서 db가 죽을거라고, 죽으면 큰일난다고 지적이 들어오는거임
??? 하면서 중간에 에러 나면 롤백 안되는데 그게 더 큰일 아니냐고 되물음
그러니까 그것도 맞는 말인데 죽을걸 뻔히 알면서 돌리면 안된다고 그러는거임
그랬더니 나온 소리가 끊어서 처리를 하면 된다는거임
참고로 기존에는 insert를 100건씩 끊어서 for루프 돌리고 있고, 이게 이 사람이 트랜잭션 크기 지적해서 바꾼 내용인거 같더라
테이블마다 100건 x 90번 하는거니까 어차피 정합성 보장 안되는건 마찬가지긴 한데 아무튼 그래서 끊어서 날리는듯
사실 나는 한번에 날리는 쿼리 최대 길이에 제한이 있어서 이렇게 코딩해 놓은줄 알았음
4. 지적한 사람이 제시한 해결 방법
이게 제일 이해가 안되는데 역시나 끊어서 날려야 된다는 소리가 나옴
한꺼번에 하는건 db가 죽을 수도 있으니, 정합성 보장을 위해서는 끊어서 해야 한다고 함
참고로 처음에 들어오는게 9000건인거고 각 테이블에 update해야 하는 데이터는 1건당 여러개일 수 있음
그래서 리스트 사이즈도 제각각이기 때문에 딱 맞춰서 보내려면 리스트 다시 돌면서 맞는거 골라와야 하는 상황
이것도 걍 그렇다 치자. 근데 이런 식으로 날리면 db쪽도 속도 저하 문제가 심각할거 아님?
근데 해결책이라고 제시한게 병렬처리로 한 100개 쓰레드 만들어서 날리면 된다는거임
5. 내가 이해가 안가는 부분 & 질문
애초에 100개 쓰레드 만든다고 그게 동시에 작동이 되긴 하나? 하드웨어적으로다가
db도 마찬가지로 이거 받을 능력 됨? 참고로 PostgreSQL임
이론상 이게 더 빠른게 맞긴 함? 쓰레드마다 커넥션풀 새로 만들어야 해서 오히려 for문 돌려서 날리는거보다 느릴거 같은데
그리고 트랜잭션에 최대 크기가 있는게 맞긴 함? 걍 하드웨어 문제 아니고?
마지막으로 쿼리 최대 길이에 제한이 있음? 많으면 18만건 insert할 수도 있는데 제한이 있다면 끊어 날리는게 맞긴 하니까
https://stackoverflow.com/questions/709708/maximum-transaction-size-in-postgresql
21억건쯤까지 된다는거같은데?
니가 빡대가린거같은데
9000건 가지고 지랄 떠는게 어이가없네;; 10만 단위 아니면 그냥 쳐해
근데 테이블마다 9000인거라 다 합치면 10만 넘을 수도 있긴 한데 괜찮음?
100만도 걍 때려버리는데ㅋㅋㅋㅋ
개발자 및 DBA로서 짧은 컨설팅을 무료로 해주마 1. 테이블 데이터 전체 delete 후 insert 하는 거면 delete 말고 truncate를 수행해서 테이블 블록 freelist로 반환 시키고 insert 해라 2. 다중 insert 그지랄로 해두면 시간이 오래 걸릴뿐만 아니라 시스템에도 악영향이 크다. 라이브러리 캐시가 씹창나고 DB
CPU 부하에다가 시간도 상상할 수 없을만큼 오래 걸리니, postgresql이 제공하는 array processing api를 찾아봐라
이상 돈 받고 해주는 무료 db 컨설팅 이었습니다.
병렬 처리는 ㄹㅇ 개소리 맞지? 아무리 생각해도 이해가 안되는데 솔직히 내가 신입이라 자신이 없음
삽입문을 멀티스레드로 구현하는 이유 : 데이터베이스의 전문가 소양이 아예 없기 때문, 이해는 하지만 DBA 시각에서 그냥 등신 머저리 그 이상도 이하도 아니란다