SQLite | 데이터베이스 (Database) | 빈공간의 정리 (VACUUM)

SQLite 데이터베이스에서 파일의 추가 및 삭제를 반복하다 보면 저장되는 데이터의 양에 비해 파일의 크기가 커질 수 있다. 여기에서는 VACUUM 문을 사용하여 사용하지 않는 공간을 확보하는 방법에 대해 설명한다.

VACUUM 사용

SQLite 데이터베이스를 생성하면 파일이 1개가 생성되고 테이블이나 저장된 데이터가 그 파일에 저장된다. 테이블에 데이터를 추가하다 보면 점차 데이터베이스 파일의 크기도 커지지만, 테이블에서 데이터를 삭제해도 바로 데이터베이스 파일의 크기가 줄어들지 않는다. 파일에서 이용되고 있던 영역은 즉시 제거하는 것이 아니라 다음 데이터가 추가될 때 재사용하려고 하기 때문이다.

평상시에는 신경 쓸 필요는 없지만, 파일 사이즈가 걱정이 된다면 VACUUM 문을 실행하여 사용하지 않는 공간을 확보하고 파일 크기를 작게 할 수 있다.

VACUUM 문은 다음과 같이 실행한다.

VACUUM;

VACUUM 문을 실행하면 데이터베이스의 내용을 임시 데이터베이스에 한번 옮겼다가 다시 되돌리는 처리를 하게 된다. 그렇게 하므로써 빈공간을 없애는 동시에 데이터를 순차적으로 저장하여 바로 잡는 작업이 이루어진다.

주의할 점은 VACUUM의 대상이 되는 것은 main 데이터베이스만 해당된다. 연결된 데이터베이스는 VACUUM의 대상이 되지 않는다. 그리고 INTEGER PRIMARY KEY가 설정된 컬럼이 없는 테이블의 경우 저장되어 있는 데이터에 할당된 ROWID는 변경 될 수 있다.

실습

그러면 실습해 보겠다. 다음과 같이 데이터베이스의 파일 크기가 16,384 바이트인 sample.sqlite3 파일이 있다.

$ ls -al
total 5048
drwxr-xr-x@ 7 kimkc  staff      238 10 19 23:20 .
drwxr-xr-x  9 kimkc  staff      306 10 17 23:49 ..
drwxr-xr-x  6 kimkc  staff      204 10 19 23:20 bak
-rw-r--r--  1 kimkc  staff    16384 10 19 23:20 sample.sqlite3
-rwxr-xr-x@ 1 kimkc  staff   691768 10 11 18:31 sqldiff
-rwxr-xr-x@ 1 kimkc  staff  1152260 10 11 18:32 sqlite3
-rwxr-xr-x@ 1 kimkc  staff   719796 10 11 18:31 sqlite3_analyzer

데이터베이스에 연결하여, 데이터베이스에 있는 테이블을 하나 삭제한다.

$ sqlite3 sample.sqlite3 
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> .table
select    user      username
sqlite> drop table user;
sqlite> 

테이블을 삭제하고 데이터베이스의 파일 크기를 확인해 보면, 삭제 이전과 변함없이 16,384 바이트로 되어 있다.

$ ls -al
total 5048
drwxr-xr-x@ 7 kimkc  staff      238 10 19 23:24 .
drwxr-xr-x  9 kimkc  staff      306 10 17 23:49 ..
drwxr-xr-x  6 kimkc  staff      204 10 19 23:20 bak
-rw-r--r--  1 kimkc  staff    16384 10 19 23:24 sample.sqlite3
-rwxr-xr-x@ 1 kimkc  staff   691768 10 11 18:31 sqldiff
-rwxr-xr-x@ 1 kimkc  staff  1152260 10 11 18:32 sqlite3
-rwxr-xr-x@ 1 kimkc  staff   719796 10 11 18:31 sqlite3_analyzer

이렇게 테이블이나 데이터를 삭제해도 즉시 데이터베이스의 파일 크기가 작아지는 것은 아니다. 그러면 데이터베이스에 다시 연결하여 VACUUM 문을 실행해 보자.

3 sample.sqlite3 
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> vacuum;
sqlite> 

VACUUM 문을 실행한 후에 데이터베이스의 파일 크기를 확인해 보면 12,288 바이트로 파일 크기가 작아진 것을 확인할 수 있다.

$ ls -al
total 5040
drwxr-xr-x@ 7 kimkc  staff      238 10 19 23:29 .
drwxr-xr-x  9 kimkc  staff      306 10 17 23:49 ..
drwxr-xr-x  6 kimkc  staff      204 10 19 23:20 bak
-rw-r--r--  1 kimkc  staff    12288 10 19 23:29 sample.sqlite3
-rwxr-xr-x@ 1 kimkc  staff   691768 10 11 18:31 sqldiff
-rwxr-xr-x@ 1 kimkc  staff  1152260 10 11 18:32 sqlite3
-rwxr-xr-x@ 1 kimkc  staff   719796 10 11 18:31 sqlite3_analyzer
kimkcui-MacBook-Pro:sqlite-tools-osx-x86-3300100 kimkc$ 

이렇게 VACUUM을 실행하면 사용되지 않는 공간을 확보하고 파일 크기를 줄일 수 있다. 파일 크기가 걱정된다면 VACUUM을 실행하도록 하자.




최종 수정 : 2019-11-13