SQLite의 WAL 메커니즘 상세 설명

1. WAL은 무엇입니까?
WAL의 전칭은 Write Ahead Logging으로 많은 데이터베이스에서 원자 업무를 실현하는 데 사용되는 메커니즘으로 SQLite는 3.7.0 버전에서 이 기능을 도입했다.
2. WAL은 어떻게 작동합니까?
WAL 메커니즘을 도입하기 전에 SQLite는 rollbackjournal 메커니즘을 사용하여 원자 업무를 실현한다.
rollbackjournal 메커니즘의 원리는 데이터베이스 파일의 데이터를 수정하기 전에 수정된 페이지의 데이터를 다른 곳에 백업한 다음에 수정을 데이터베이스 파일에 기록하는 것이다.업무가 실패하면 백업 데이터를 복사하여 수정을 취소합니다.업무가 성공하면 백업 데이터를 삭제하고 수정을 제출합니다.
WAL 메커니즘의 원리는 수정이 데이터베이스 파일에 직접 기록되지 않고 다른 WAL이라고 불리는 파일에 기록된다는 것이다.트랜잭션이 실패하면 WAL의 레코드가 무시되고 수정이 취소됩니다.만약 업무가 성공한다면, 그 다음 시간에 데이터베이스 파일로 쓰여 수정을 제출할 것입니다.
WAL 파일과 데이터베이스 파일을 동기화하는 행위를 checkpoint(검사점)라고 하는데 이것은 SQLite에서 자동으로 실행되며 기본적으로 WAL 파일이 1000페이지로 쌓여 수정될 때이다.물론 적당한 때에 수동으로 checkpoint를 실행할 수 있으며 SQLite는 관련 인터페이스를 제공합니다.checkpoint를 실행하면 WAL 파일이 비워집니다.
읽을 때 SQLite는 WAL 파일에서 검색하여 마지막 쓰기 포인트를 찾아 기억하고 그 이후의 쓰기 포인트를 무시합니다. 이것은 읽기와 읽기가 동시에 실행될 수 있도록 보장합니다.그런 다음 읽을 데이터가 있는 페이지가 WAL 파일에 있는지, 있는 경우 WAL 파일의 데이터를 읽고, 없는 경우 데이터베이스 파일의 데이터를 직접 읽습니다.
작성할 때 SQLite는 WAL 파일에 쓰기만 하면 되지만 단독 쓰기를 보장해야 하므로 쓰기 간에 병행할 수 없습니다.
WAL은 구현 과정에서 공유 메모리 기술을 사용하기 때문에 모든 읽기와 쓰기 프로세스는 같은 기계에 있어야 한다. 그렇지 않으면 데이터의 일치성을 보장할 수 없다.
3. WAL의 장점과 단점
장점:
1. 읽기와 쓰기는 완전히 병행하여 실행할 수 있고 서로 막히지 않는다(그러나 쓰기 사이에는 여전히 병행할 수 없다).
2. WAL은 대부분의 경우 두 개의 파일을 쓸 필요가 없기 때문에 더 좋은 성능을 제공합니다.
3. 디스크 입출력 동작을 예측하기 쉽습니다.
단점:
1. 데이터베이스에 접근하는 모든 프로그램은 같은 호스트에 있어야 하며 공유 메모리 기술을 지원해야 한다.
2. 각 데이터베이스는 현재 3개의 파일에 대응합니다:.db,-wal,-shm.
3. 쓰기 데이터가 GB 레벨에 도달하면 데이터베이스 성능이 떨어진다.
4.3.7.0 이전 SQLite에서는 WAL 메커니즘이 활성화된 데이터베이스 파일을 인식할 수 없습니다.
4. WAL 도입 호환성 문제
WAL이 활성화된 후 데이터베이스 파일 형식의 버전 번호가 1에서 2로 업그레이드되었기 때문에 3.7.0 이전의 SQLite는 WAL 메커니즘이 활성화된 데이터베이스 파일을 식별할 수 없습니다.
WAL을 비활성화하면 데이터베이스 파일 형식의 버전 번호가 1로 복원되어 SQLite 3.7.0 이전 버전으로 인식됩니다.
5. WAL 도입 성능 문제
일반적으로 WAL은 SQLite의 트랜잭션 성능을 향상시킵니다.그러나 어떤 극단적인 상황에서는 SQLite 트랜잭션 성능의 저하를 초래할 수 있다.
1. 업무 수행 시간이 비교적 길거나 수정할 데이터량이 GB급에 달할 때 WAL 파일이 점용되고 일시적으로 checkpoint의 실행을 막는다(checkpoint는 WAL 파일을 비운다). 이로 인해 WAL 파일이 커지고 주소 찾기 시간이 증가하며 결국 읽기와 쓰기 능력이 떨어진다.
2. checkpoint가 실행될 때 당시의 읽기와 쓰기 성능을 떨어뜨리기 때문에 WAL은 주기적인 성능을 떨어뜨릴 수 있다.
6. WAL 관련 PRAGMA 및 커넥터

PRAGMA journal_mode
PRAGMA wal_checkpoint
PRAGMA wal_autocheckpoint
sqlite3_wal_checkpoint
sqlite3_wal_autocheckpoint
sqlite3_wal_hook

좋은 웹페이지 즐겨찾기