【5分でわかる】SQLiteのファイルサイズの圧縮(VACUUM)方法

 

★悩み★
・なぜ、SQLite内に数行のデータしかないのにファイルサイズが巨大なの?
・SQLiteの空き領域を開放(圧縮)したいけど、どのコマンドを実行するの?
・VACUUM文を使い、SQLiteのファイルサイズを圧縮する手順を知りたい。


こういった「悩み」に答えます。

 

★本記事の内容★
① SQLiteで「格納データ量に比例しないファイルサイズ」になる理由を解説
② SQLite3でファイルサイズを圧縮(VACUUM)するための準備を解説
③「VACUUM文」を用いてSQLite3のファイルサイズを圧縮する手順を解説



これからご紹介する「SQLiteでファイルサイズを圧縮(VACUUM)する方法」を実践したことで、筆者は5分以内でSQLite3のファイルを圧縮できました。

記事の前半では「SQLiteで『格納データ量に比例しないファイルサイズ』になる理由」を紹介します。
記事の後半では「VACUUM文を使って、SQLite3のファイルサイズを圧縮(空き領域を開放)する手順」を紹介します。

この記事を読み終えることで、「SQLite3でファイルサイズを圧縮(空き領域を開放)する手順」を把握できるだけでなく、「VACUUM文の構文」も把握した状態になります。
 

★SQLite3とは★
SQLiteは、「小型」/「高速」/「自己充足的」/「高信頼性」なSQLデータベースエンジンを実装したC言語ライブラリです。
ちなみに、SQLiteのメリットとデメリットに関して知りたい方には、以下の記事がオススメです。
>> 【要点】SQLiteとは?を解消!初心者向けに特徴から使い方を解説


  

ちなみに、筆者が約2週間でSQLite3を学んだ方法や手順について以下で公開しています。皆様の学習の参考になれば嬉しいです。

>> SQLite3に0から入門し基本操作を習得するまでのロードマップ


 

 


 

SQLiteで「格納データ量に比例しないファイルサイズ」になる理由


『SQLiteで「格納データ量に比例しないファイルサイズ」になる理由』に関して解説します。

「格納データ量に比例しないファイルサイズになる理由」を図で解説しますね。



SQLite3では、下図のように「行」と「列」単位でデータを管理しています。
 



SQLite3内のデータを削除した場合、下図のように「確保された領域」は削除されないまま残ります。
 



残った「確保された領域」は、次に「データ追加」した場合に、下図のように再利用される場合があります。
 



すなわち、「テーブルから大量データを削除した」直後には、「格納データ量に比例しないファイルサイズ」になってしまいます。
 

以上が、『SQLiteで「格納データ量に比例しないファイルサイズ」になる理由』となります。
 

SQLite3のテーブルから、大量のデータを削除した場合、以降でご紹介する「VACCUM文(ファイルサイズを圧縮)」の実行を検討しましょう。

 

SQLite3でファイルサイズを圧縮(VACUUM)するための準備


「SQLite3でファイルサイズを圧縮(VACUUM)するための準備」に関してご紹介します。

★SQLite3でファイルサイズを圧縮(VACUUM)するための準備の流れ★
手順1:SQLite3をインストール
手順2:インストールしたSQLite3の動作確認
手順3:SQLite3内にテーブルを作成
手順4:SQLite3内に大量データを追加(データ登録)



上記手順を実施することで、「SQLite3でファイルサイズを圧縮(VACUUM)するための準備」ができます。
 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2022年2月14日
動作確認済み環境:Ubuntu 20.04.3 LTS



以降で、上記「SQLite3でファイルサイズを圧縮(VACUUM)するための準備の流れ」の各手順に関してご説明します。
 

手順1:SQLite3をインストール

「手順1:SQLite3をインストール」に関して解説します。
 

SQLite3のファイルサイズを圧縮(空き領域を開放)するためにも、SQLite3をインストールしましょう。



「SQLite3をインストールする手順」に関しては、お使いのパソコンごとに以下の記事を参照しインストールしましょう。

>>【コピペOK】SQLite3をインストールする手順【Linux向け】

>>【コピペOK】SQLite3をインストールする手順【Ubuntu向け】

>>【最短5分】SQLiteをWindowsへインストールする方法(6枚で図解)

>>【コピペOK】SQLite3をインストールする手順【MacOS向け】



以上で、「手順1:SQLite3をインストール」は完了です。
 

手順2:インストールしたSQLite3の動作確認

「手順2:インストールしたSQLite3の動作確認」に関して解説します。
 

動作確認として、インストールしたSQLite3に接続できることを確認しましょう。



「SQLite3に接続する方法」に関しては、以下の記事「SQLite3へ接続する方法」の箇所をご覧ください。
 



以上で、「手順2:インストールしたSQLite3の動作確認」は完了です。
 

手順3:SQLite3内にテーブルを作成

「手順3:SQLite3内にテーブルを作成」に関して解説します。
 

SQLite3のファイルサイズを圧縮(空き領域を開放)するためには、SQLite3内にテーブルを作成する必要があります。



「SQLite3内にテーブルを作成」に関しては、以下の記事をご覧ください。
 



以上で、「手順3:SQLite3内にテーブルを作成」は完了です。
 

以降の手順では、上記の記事で作成した「meibo」テーブルを想定として、手順を解説します。
 

手順4:SQLite3内に大量データを追加(データ登録)

「手順4:SQLite3内に大量データを追加(データ登録)」に関して解説します。
 

SQLite3のファイルサイズを圧縮(空き領域を開放)がどのぐらい効果があるかを検証するために、大量データをSQLite3に格納しましょう。



大量データをSQLite3に格納するために、以下のコマンドを順に実行してください。

# ↓ SQLite3に接続 ↓
# sqlite3 testdb.sqlite3 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.

# ↓ SQLite3内に存在するテーブルの定義を確認 ↓
sqlite> .schema
CREATE TABLE meibo (id integer, name text);

# ↓ SQLite3に大量データを追加(1万のデータを登録) ↓
with recursive
generate_series(x) as (
 select 1
 union all
 select x+1 from generate_series limit 10000
) insert into meibo (id, name) select x, 'tom'||x from generate_series;

# ↓ 追加されたデータの数を確認 ↓
sqlite> select count(*) from meibo;
10000

# ↓ 追加したデータの一部を確認 ↓
sqlite> select * from meibo limit 2;
1|tom1
2|tom2



コマンド実行後、「10000」が表示された場合、「正常にSQLite3内に大量データを追加できた」と判断できます。
 

SQLite3内のテーブルに大量データを追加するコマンドは、以下のサイトを参考にさせていただきました。
参照:SQLite3 で generate_series(連番)



以上が、「手順4:SQLite3内に大量データを追加(データ登録)」となります。
 

上記の流れで、SQLite3でファイルサイズを圧縮(VACUUM)するための準備ができました。


 

「VACUUM文」を用いてSQLite3のファイルサイズを圧縮する手順


『「VACUUM文」を用いてSQLite3のファイルサイズを圧縮する手順』に関して解説します。
 

SQLite3のファイルサイズを圧縮(空き領域の開放)するためには、「VACUUM文」を使います。



VACUUM文の「構文」は、以下となります。

VACUUM;



上記の構文をもとにして、以下の「VACUUM文」を実行し、SQLite3のファイルサイズを圧縮してみましょう。

# ↓ SQLite3のファイルサイズを確認 ↓
# ls -ltrh testdb.sqlite3 
-rw-r--r-- 1 hero hero 176K Feb 14 11:22 testdb.sqlite3

# ↓ SQLite3に接続 ↓
# sqlite3 testdb.sqlite3 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.

# ↓ SQLite3内に存在するテーブルの定義を確認 ↓
sqlite> .schema
CREATE TABLE meibo(id, name);

# ↓ テーブルに登録されたデータの数を確認 ↓
sqlite> select count(*) from meibo;
10000

# ↓ テーブルを削除 ↓
sqlite> drop table meibo;

# ↓ SQLite3内に存在するテーブルの定義を確認 ↓
sqlite> 

# ↓ SQLite3から切断 ↓
sqlite> .exit

# ↓ SQLite3のファイルサイズを確認(ファイルサイズが減っていないことを確認) ↓
# ls -ltrh testdb.sqlite3 
-rw-r--r-- 1 hero hero 176K Feb 14 22:09 testdb.sqlite3

# ↓ SQLite3に接続 ↓
# sqlite3 testdb.sqlite3 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.

# ↓ 空き領域を開放するためにVACUUM文を実行 ↓
sqlite> VACUUM;

# ↓ SQLite3から切断 ↓
sqlite> .exit

# ↓ SQLite3のファイルサイズを確認(テーブルサイズが圧縮されたことを確認) ↓
# ls -ltrh testdb.sqlite3 
-rw-r--r-- 1 hero hero 4.0K Feb 14 22:10 testdb.sqlite3



コマンド実行後、「SQLite3のファイルサイズが圧縮されていた」場合、「正常にVACUUM文で空き領域を解放できた」と判断できます。
 

★VACUUM文のコマンドリファレンス★
VACUUM文のコマンドリファレンスは、以下に公開されています。
参照:VACUUM文のコマンドリファレンス(公式サイト)



以上が、『「VACUUM文」を用いてSQLite3のファイルサイズを圧縮する手順』となります。
 

上記のVACUUM文を実施することで、「SQLite3のファイルサイズを圧縮する」ことができました。


 

【まとめ】SQLiteのファイルサイズの圧縮(VACUUM)方法


いかがでしたでしょうか?「VACUUM文を実行して、SQLiteのファイルサイズを圧縮(空き領域を解放)する方法」を解説し、以下の悩みを解決しました。
 

★悩み★
・なぜ、SQLite内に数行のデータしかないのにファイルサイズが巨大なの?
・SQLiteの空き領域を開放(圧縮)したいけど、どのコマンドを実行するの?
・VACUUM文を使い、SQLiteのファイルサイズを圧縮する手順を知りたい。



ぜひあなたも本記事を参考に「SQLite3のファイルサイズを圧縮」を実践してください。


 

 


 

コメント