그래서 매우 큰 파일에 대해 sqlite로 몇 가지 테스트를 수행하고 결론을 얻었습니다 (적어도 특정 응용 프로그램에 대해서는).
테스트에는 단일 테이블 또는 여러 테이블이있는 단일 sqlite 파일이 포함됩니다. 각 테이블에는 약 8 개의 열, 거의 모든 정수 및 4 개의 인덱스가 있습니다.
아이디어는 sqlite 파일이 약 50GB가 될 때까지 충분한 데이터를 삽입하는 것이 었습니다.
싱글 테이블
하나의 테이블로 sqlite 파일에 여러 행을 삽입하려고했습니다. 파일이 약 7GB 였을 때 (죄송합니다. 행 수를 구체적으로 지정할 수는 없습니다) 삽입 시간이 너무 오래 걸렸습니다. 모든 데이터를 삽입하는 테스트에 24 시간 정도 소요될 것으로 예상했지만 48 시간이 지나도 완료되지 않았습니다.
이것은 매우 큰 단일 sqlite 테이블에 삽입 및 다른 작업에도 문제가 있다는 결론을 내립니다.
테이블이 커지면 모든 인덱스를 삽입하고 업데이트하는 데 시간이 오래 걸리기 때문에 이것이 놀라운 일이 아닙니다.
여러 테이블
그런 다음 하루에 한 테이블 씩 여러 테이블에서 시간별로 데이터를 분할하려고했습니다. 원본 1 테이블의 데이터는 ~ 700 테이블로 분할되었습니다.
이 설정은 삽입에 문제가 없었으며 매일 새 테이블이 만들어 지므로 시간이 지날수록 시간이 오래 걸리지 않았습니다.
진공 문제
i_like_caffeine이 지적한 바와 같이 VACUUM 명령은 sqlite 파일이 클수록 문제가됩니다. 더 많은 삽입 / 삭제가 수행되면 디스크에서 파일 조각화가 더 나빠 지므로 파일을 최적화하고 파일 공간을 복구하기 위해 주기적으로 VACUUM을 사용하는 것이 목표입니다.
그러나 documentation 에서 지적했듯이 데이터베이스의 전체 사본은 진공을 수행하기 위해 만들어지며 완료하는 데 시간이 오래 걸립니다. 따라서 데이터베이스가 작을수록이 작업이 더 빨리 완료됩니다.
결론
특정 응용 프로그램의 경우 진공 성능과 삽입 / 삭제 속도를 모두 극대화하기 위해 하루에 하나씩 여러 db 파일로 데이터를 분할 할 것입니다.
이로 인해 쿼리가 복잡해 지지만 많은 양의 데이터를 인덱싱 할 수 있다는 점에서 가치가 있습니다. 또 다른 장점은 전체 db 파일을 삭제하여 하루의 가치있는 데이터 (응용 프로그램의 일반적인 작업)를 삭제할 수 있다는 것입니다.
속도가 문제가 될 때를 확인하기 위해 파일 당 테이블 크기를 모니터링해야 할 것입니다.
자동 진공 이외의 증분 진공 방법이없는 것 같습니다 . 진공 청소기의 목표는 자동 진공 청소기가하지 않는 파일 조각 모음 (파일 공간이별로 중요하지 않음)이기 때문에 사용할 수 없습니다. 실제로 문서화에 따르면 조각화가 더 심해질 수 있으므로 파일을 주기적으로 완전히 진공 청소기로 청소해야합니다.