안녕하세요
이번에 새로 싸이트 만들면서 쿼리문을 ci에서 지원해주는 방식으로 만들어보고 있습니다.
(쿼리 빌더 클래스??)
생소하지만 이렇게 버릇을 들여놔야 좋을거 같아서요 ㅎㅎ
그러던 중 조금 많은... insert 작업이 있습니다.
경우에 따라 다르지만 현재는 20만건 정도..
차후에는 50만건, 100만건으로 늘어날수도 있습니다.
각 컬럼에 맞게끔 배열을 만들고 해당 배열을 insert_batch 로 집어넣는 작업을 하고 있었는데요.
오늘 처음으로 메모리 fatal 에러가 나왔습니다.
php.ini 에는 메모리 제한을 512M 으로 해둔 상태인데 이걸 넘겼다고 나오네요.
100만건을 넣든, 200만건을 넣든 512M을 초과한다는거 자체만으로도 쫌 문제가 되는데요 ...
과거에는 텍스트로 쿼리문을 만들고 db->query() 로 처리 했기 때문에 쿼리문을 분할해서 만들고 돌리는 방법을 썼었는데...
이번에도 그렇게 해야할까요?
이렇게 다량의 데이터를 insert 할때는 어떻게 하는게 좋을까요?
생각중인 방법들...
1. 과거처럼 문자열로 된 query문을 만들고 적당히 잘라서 한번씩 실행시킨다.
2. 반복문을 돌면서 insert_batch에서 쓸 배열을 만들고 있는데, 적당히 반복돌면 중간에 insert_batch 돌리고 배열을 초기화한 후 다시 반복문을 돌린다.
3. 단순 insert문으로 변경하고 반복문을 돌때마다 insert 시킨다.
4. 혹시 insert_batch 관련해서 메모리나 캐시를 초기화 시키는 방법이 있어서 중간중간 초기화하여 메모리부담을 줄일 수 있는 방법이 있는지??
@한대승
헉. 빠른 답변 감사합니다.
넵 2번 방법으로 시도해보겠습니다 감사합니다!
insert_batch 에 대해서 추가 설명을 하자면...
100개를 한번에 배열에 쌓아두고 쿼리를 실행하냐와 일반 insert 는 쿼리를 1개 단위로 실행하냐의 차이입니다.
insert_batch 가 대단한 무언가를 가진 기능은 아닌 그저 여러개 배열에 저장하고 한번에 실행 한다는 수준이라서 말이죠.
요약하면 1개단위로 DB에 쿼리를 실행을 하지 않고 쌓아두고 한꺼번에 쿼리를 실행하면 그게 insert_batch 기능.
다만 빽엔드에서 돌아가는 구조도 사실 1쿼리 단위로 끊어서 실행 했던걸로 기억합니다.
즉 2번과 3번은 큰 차이가 없지 않나 싶긴한데... 한번 테스트 해봐야겠네요.
과거 1번 방법으로 할때는..
insert into `테이블` values ('1번값'),('2번값'),('3번값'),('4번값')
이런식으로 문자열을 만들고 일정 횟수 이상 쌓이면 작동하게끔 했었는데...
insert_batch 도 이런 쿼리문을 만드는걸까요?
일단 1천번 반복문 돌면 실행시키고 배열을 초기화 시킨 후 다시 쌓도록 내용을 변경했습니다.
결과는 내일 댓글로 남기겠습니다. 조언 감사합니다. :)
몽땅 insert_batch 로 때려박는 방식에서,
배열을 만드는 반복문이 1천번 돌때마다 입력하고 배열 초기화 후 다시 입력하는 방법으로 변경했습니다.
결과론적으로 속도에 있어서 큰 차이는 없었습니다 :)
메모리는 과거 512M을 초과하는 것으로 나와 오류를 뿜뿜하였지만, 현재 1천건에 따른 예상 데이터 사용량은 30M미만이라 크게 무리 없어 보입니다.
2번 추천
과거로 회기하는 1번은 아닌것 같고
3번은 시간 많이 걸립니다.
4번은 배열이 메모리를 잡고 있어서 방법이 없을것 같습니다.