最近在處理一個小型專案,在測試期間對Sqlite讀寫近千萬筆的資料後,當測試完畢後整個Table drop。
DB檔案占用磁碟大小卻沒有任何改變,讓我非常困惑到底發生甚麼事情。
SQLite 官方文件裡有完整概念說明,當sql資料刪除後並不會把資源還回去,而是會記錄到一個閒置空間的表單,如果有資料要再次寫入會優先利用這些空間。
當然可以在建立DB時設定自動回收的模式,但有機會造成DB更加碎片化而導致效能低落。
故直接使用手動方式執行命令,讓DB重建資料順序及空間的方式來進行處理。
執行壓縮指令VACUUM
提供兩種方式一種是直接登入資料庫,下指令執行命令。但個人習慣把東西寫成腳本後,定時排程執行以後有需要也可以引用在其他程式中使用。
/*
在SQL中執行此指令即可
*/
VACUUM
import sqlite3
# .\sql_data.db 要改成自己的DB路徑
ipdata_connection = sqlite3.connect('.\sql_data.db')
ip_cur = ipdata_connection.cursor()
ip_cur.execute("VACUUM;")
ipdata_connection.commit()
ipdata_connection.close()