Tóm tắt :trong hướng dẫn này, chúng tôi sẽ giải thích lý do tại sao bạn cần sử dụng SQLite VACUUM
và chỉ ra cách sử dụng nó để tối ưu hóa tệp cơ sở dữ liệu.
Tại sao bạn cần SQLite VACUUM
lệnh
Đầu tiên, khi bạn thả các đối tượng cơ sở dữ liệu như bảng, dạng xem, chỉ mục và trình kích hoạt hoặc xóa dữ liệu khỏi bảng, kích thước tệp cơ sở dữ liệu vẫn không thay đổi. Bởi vì SQLite chỉ đánh dấu các đối tượng đã xóa là miễn phí và dự trữ nó cho các lần sử dụng sau. Do đó, kích thước của tệp cơ sở dữ liệu luôn tăng về kích thước.
Thứ hai, khi bạn chèn hoặc xóa dữ liệu khỏi bảng, các chỉ mục và bảng sẽ bị phân mảnh, đặc biệt là đối với cơ sở dữ liệu có số lần chèn, cập nhật và xóa cao.
Thứ ba, các thao tác chèn, cập nhật và xóa tạo ra khối dữ liệu không sử dụng trong các trang cơ sở dữ liệu riêng lẻ. Nó làm giảm số lượng hàng có thể được lưu trữ trong một trang. Do đó, nó làm tăng số lượng trang để chứa một bảng. Vì điều này, nó làm tăng chi phí lưu trữ cho bảng, mất nhiều thời gian hơn để đọc / ghi và giảm hiệu suất bộ nhớ cache.
SQLite cung cấp VACUUM
lệnh để giải quyết cả ba vấn đề trên.
SQLite lần đầu tiên sao chép dữ liệu trong tệp cơ sở dữ liệu sang cơ sở dữ liệu tạm thời. Thao tác này phân mảnh các đối tượng cơ sở dữ liệu, bỏ qua không gian trống và đóng gói lại các trang riêng lẻ. Sau đó, SQLite sao chép nội dung của tệp cơ sở dữ liệu tạm thời trở lại tệp cơ sở dữ liệu ban đầu. Tệp cơ sở dữ liệu gốc bị ghi đè.
Bởi vì VACUUM
lệnh xây dựng lại cơ sở dữ liệu, bạn có thể sử dụng nó để thay đổi một số tham số cấu hình cơ sở dữ liệu cụ thể như kích thước trang, định dạng trang và mã hóa mặc định. Để thực hiện việc này, bạn đặt các giá trị mới bằng pragma và sau đó hút chân không cơ sở dữ liệu.
SQLite VACUUM
lệnh
VACUUM
lệnh không thay đổi nội dung của cơ sở dữ liệu ngoại trừ các giá trị rowid. Nếu bạn sử dụng INTEGER PRIMARY KEY
cột VACUUM
không thay đổi các giá trị của cột đó. Tuy nhiên, nếu bạn sử dụng rowid không phân biệt, thì VACUUM
lệnh sẽ đặt lại các giá trị rowid. Bên cạnh việc thay đổi các giá trị rowid, VACUUM
lệnh cũng tạo chỉ mục từ đầu.
Một phương pháp hay là thực hiện VACUUM
lệnh định kỳ, đặc biệt là khi bạn xóa các bảng hoặc chỉ mục lớn khỏi cơ sở dữ liệu.
Điều quan trọng cần lưu ý là VACCUM
lệnh yêu cầu bộ nhớ để giữ tệp gốc và cả bản sao. Ngoài ra, VACUUM
lệnh yêu cầu quyền truy cập độc quyền vào tệp cơ sở dữ liệu. Nói cách khác, VACUUM
lệnh sẽ không chạy thành công nếu cơ sở dữ liệu có câu lệnh SQL đang chờ xử lý hoặc giao dịch đang mở.
Hiện tại, kể từ phiên bản 3.9.2, bạn có thể chạy VACUUM
trên main
cơ sở dữ liệu, không phải tệp cơ sở dữ liệu đính kèm.
Mặc dù SQLite cho phép chế độ hút chân không tự động kích hoạt quá trình hút chân không tự động với một số hạn chế. Một phương pháp hay là chạy VACUUM
ra lệnh thủ công.
Cách chạy SQLite VACUUM
lệnh
Phần sau trình bày cách chạy VACUUM
lệnh:
VACUUM;
Code language: SQL (Structured Query Language) (sql)
Đảm bảo rằng không có giao dịch nào đang mở khi bạn đang chạy lệnh.
Câu lệnh sau cho phép chế độ hút chân không hoàn toàn tự động:
PRAGMA auto_vacuum = FULL;
Code language: SQL (Structured Query Language) (sql)
Để bật chân không gia tăng, bạn sử dụng câu lệnh sau:
PRAGMA auto_vacuum = INCREMENTAL;
Code language: SQL (Structured Query Language) (sql)
Câu lệnh sau tắt chế độ hút bụi tự động:
PRAGMA auto_vacuum = NONE;
Code language: SQL (Structured Query Language) (sql)
VACUUM
với một INTO
mệnh đề
Đây là cú pháp của VACUUM
với INTO
mệnh đề:
VACUUM schema-name INTO filename;
Code language: SQL (Structured Query Language) (sql)
VACUUM
câu lệnh với INTO
mệnh đề giữ cho tệp cơ sở dữ liệu gốc không thay đổi và tạo một cơ sở dữ liệu mới với tên tệp được chỉ định. Cơ sở dữ liệu mới sẽ chứa nội dung lôgic giống như cơ sở dữ liệu ban đầu, nhưng hoàn toàn được làm sạch.
filename
trong INTO
mệnh đề có thể là bất kỳ biểu thức SQL nào đánh giá thành một chuỗi. Nó phải là một đường dẫn đến một tệp không tồn tại hoặc đến một tệp trống hoặc VACUUM INTO
lệnh sẽ dẫn đến lỗi.
VACUUM
lệnh rất hữu ích để tạo các bản sao lưu của cơ sở dữ liệu trực tiếp. Nó là giao dịch an toàn, mà cơ sở dữ liệu được tạo là một ảnh chụp nhanh nhất quán của cơ sở dữ liệu gốc. Tuy nhiên, nếu tắt hoặc mất điện ngoài kế hoạch làm gián đoạn lệnh, cơ sở dữ liệu đã tạo có thể bị hỏng.
Câu lệnh sau sử dụng VACUUM INTO
lệnh tạo cơ sở dữ liệu mới với tên tệp chinook_backup.db
có dữ liệu được sao chép từ main
lược đồ của chinook
cơ sở dữ liệu:
VACUUM main INTO 'c:\sqlite\db\chinook_backup.db';
Code language: JavaScript (javascript)
Trong hướng dẫn này, bạn đã biết lý do tại sao bạn cần sử dụng SQLite VACUUM
và cách chạy nó để tối ưu hóa cơ sở dữ liệu.