SQLite - VACUUM: 데이터베이스 정리하기

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘은 SQLite의 흥미로운 측면을 탐구해보겠습니다. 데이터베이스를 깨끗하고 정리된 상태로 유지하는 것입니다. 마치 디지털 집을 봄 청소하는 것처럼! SQLite의 VACUUM 세계를 탐험해 보겠습니다.

SQLite - VACUUM

VACUUM은 무엇인가요?

구체적인 내용에 들어가기 전에, VACUUM에 대해 이해해 보겠습니다. 책장(데이터베이스)에 가득 찬 책(데이터)을 상상해 보세요. 시간이 지남에 따라 책을 추가하고 제거하면, 공간이 비어 있거나 책이 질서대로 정리되지 않은 상태가 될 수 있습니다. VACUUM은 그 책장을 다시 정리하고, 공간을 제거하고, 더 효율적으로 만드는 것입니다.

SQLite에서 VACUUM은 다음과 같은 방식으로 데이터베이스를 최적화하는 데 도움이 됩니다:

  1. 사용되지 않은 공간을 회수합니다.
  2. 데이터베이스 파일을 분할합니다.
  3. 쿼리 성능을 향상시킬 수 있습니다.

이제 이 최적화 작업을 수행하는 두 가지 주요 방법을 탐구해 보겠습니다: 수동 VACUUM과 자동 VACUUM.

수동 VACUUM

기본 사항

수동 VACUUM은 방이 지저분해지면 정리하기로 결정하는 것과 같습니다. 스스로 시작해야 하지만, 정리 시기를 제어할 수 있습니다.

수동 VACUUM을 수행하는 방법은 다음과 같습니다:

VACUUM;

네, 이렇게 간단합니다! 하나의 명령어만으로 SQLite가 데이터베이스를 정리하기 시작합니다.

수동 VACUUM 사용 시기

다음과 같은 상황에서 수동 VACUUM을 사용할 수 있습니다:

  1. 많은 데이터를 삭제한 후
  2. 데이터베이스 구조에 중요한 변경을 가한 후
  3. 데이터베이스 파일 크기가 실제 데이터보다 훨씬 크다고 느낄 때

예시 사례

실제 예시를 통해 수동 VACUUM을 사용하는 방법을 살펴보겠습니다.

-- 샘플 테이블 생성
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT,
author TEXT
);

-- 데이터 추가
INSERT INTO books (title, author) VALUES
('1984', 'George Orwell'),
('To Kill a Mockingbird', 'Harper Lee'),
('Pride and Prejudice', 'Jane Austen');

-- 데이터베이스 크기 확인 (SQLite 외부에서 파일 시스템에서 확인)
-- 예를 들어, 크기가 20KB입니다

-- 데이터 삭제
DELETE FROM books WHERE id = 2;

-- 파일 크기는 여전히 20KB일 수 있습니다

-- VACUUM 수행
VACUUM;

-- 다시 파일 크기 확인하면, 더 작아졌어야 합니다!

이 예제에서, 데이터를 삭제한 후 파일 크기가 즉시 변경되지 않았지만, VACUUM을 실행한 후 SQLite가 데이터베이스를 다시 정리하여 크기를 줄일 수 있습니다.

자동 VACUUM

자동 VACUUM 이해하기

자동 VACUUM은 방이 지저분해지면 자동으로 조금씩 청소하는 작은 로봇처럼입니다. 활성화되면 데이터를 삭제할 때 자동으로 공간을 회수합니다.

자동 VACUUM 활성화

자동 VACUUM을 활성화하려면 데이터베이스를 처음 만들 때 설정해야 합니다. 다음과 같이 합니다:

PRAGMA auto_vacuum = FULL;

자동 VACUUM에는 세 가지 모드가 있습니다:

모드 설명
NONE 0 자동 VACUUM 비활성화 (기본)
FULL 1 각 트랜잭션 후 자동으로 VACUUM 실행
INCREMENTAL 2 증분적으로 VACUUM, 트랜잭션 간에 작업 분산

자동 VACUUM 예시

자동 VACUUM이 어떻게 작동하는지 예시를 통해 살펴보겠습니다:

-- 자동 VACUUM 활성화 (테이블 생성 전에 수행)
PRAGMA auto_vacuum = FULL;

-- 우리의 books 테이블 생성
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT,
author TEXT
);

-- 데이터 추가
INSERT INTO books (title, author) VALUES
('The Great Gatsby', 'F. Scott Fitzgerald'),
('Moby-Dick', 'Herman Melville'),
('War and Peace', 'Leo Tolstoy');

-- 레코드 삭제
DELETE FROM books WHERE id = 2;

-- 자동 VACUUM으로, 공간이 자동으로 회수됩니다!
-- 수동으로 VACUUM을 실행할 필요 없습니다

이 경우, 레코드를 삭제할 때 자동으로 공간이 회수됩니다.

수동과 자동 VACUUM 선택

그렇다면, 무엇을 선택해야 할까요? 이는 필요에 따라 다릅니다:

  1. 수동 VACUUM은 다음과 같은 경우에 적합합니다:
  • 최적화 시기를 완전히 제어하고 싶을 때
  • 데이터베이스가 자주 변경되지 않을 때
  • VACUUM 간격 동안 파일 크기가 커도 괜찮을 때
  1. 자동 VACUUM은 다음과 같은 경우에 적합합니다:
  • "설정하고 잊는" 접근 방식을 원할 때
  • 데이터베이스가 자주 변경될 때
  • 파일 크기를 항상 최소화하고 싶을 때

마치 방을 스스로 청소하는 것(수동 VACUUM)과 매일 약간씩 청소하는 로봇(자동 VACUUM)을 선택하는 것과 같습니다.

결론

이제 여러분은 SQLite의 VACUUM 세계를 탐험했습니다. 수동 정리에서 자동 정리까지, 데이터베이스를 원활하고 효율적으로 유지하는 방법을 배웠습니다.

기억하세요, 깨끗한 데이터베이스는 행복한 데이터베이스입니다! 이제 자신감 있게 VACUUM을 수행해 보세요. 데이터 마법사 여러분, 즐거운 코딩을 하세요!

Credits: Image by storyset