테이블과 기본 키가 두 개의 정수로 구성된 Sqlite3 데이터베이스가 있는데 많은 데이터를 삽입하려고합니다 (예 : 약 1GB 정도)Sqlite3 : 삽입하는 동안 기본 키 색인을 사용하지 않도록 설정 하시겠습니까?
내가 겪고있는 문제는 다음과 같습니다. 기본 키를 만드는 것 또한 암묵적으로 인덱스를 만듭니다. 내 경우에는 커밋을 한 후 크롤링을 중단합니다. (데이터베이스 파일이 NFS에 있기 때문에 발생합니다. sigh).
그래서 임시로 해당 색인을 비활성화하고 싶습니다. 지금까지 필자의 가장 좋은 계획은 기본 키의 자동 인덱스를 삭제하는 것이었지만, SQLite는이를 좋아하지 않으므로 시도 할 때 오류가 발생합니다.
두 번째로 좋은 계획은 응용 프로그램이 네트워크 드라이브에 데이터베이스의 투명한 복사본을 만들어 수정 한 다음 다시 병합하는 것입니다. 대부분의 SQlite/NFS 질문과 달리 액세스 동시성은 필요하지 않습니다.
그런 식으로 올바른 방법은 무엇입니까?
업데이트 : 그러나 모든 다음, 일괄 항목을 삽입하는 사실에있어 :
PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY
UPDATE 2 :
내가 이미 사용하고 플래그를 지정하는 것을 잊었다 일괄 처리는 이전보다 커밋 속도가 느리다 (나는 이것이 인덱스의 크기와 관련이 있다고 가정한다). 나는 10k와 50k 튜플 사이의 일괄 처리를 시도했다. 각 튜플은 두 개의 정수와 부동 소수점이다.
하나의 데이터 당 금액 유지 INSERT cache_size 매개 변수로 확인 된 문이이 트릭을 수행하는 것으로 보입니다. 분명히 캐시가 많기 때문에 한 번에 더 많은 항목을 삽입 할 수 있습니다. 또한 결국 모든 것을 끝내고 커밋을 할 수있는 것처럼 보입니다. –
글쎄, 할 수있어. 하지만 O (1) 인 삽입 작업의 주된 트릭은 해당 인덱스로 정렬 된 데이터를 채우는 것이지만 데이터가 메모리 캐시에 들어갈 경우 모든 것이 실제로 빠릅니다. 커밋 크기를 캐시 크기보다 작게 유지하는 것이 합당합니다. 그렇지 않으면 sqlite가 강제로 디스크로 옮깁니다. – Mash