Резюме :в този урок ще обясним защо трябва да използвате SQLite VACUUM
команда и покажете как да я използвате за оптимизиране на файла на базата данни.
Защо имате нужда от SQLite VACUUM
команда
Първо, когато пуснете обекти на база данни като таблици, изгледи, индекси и тригери или изтриете данни от таблици, размерът на файла на базата данни остава непроменен. Тъй като SQLite просто маркира изтритите обекти като безплатни и ги запазва за бъдещи употреби. В резултат на това размерът на файла на базата данни винаги нараства.
Второ, когато вмъквате или изтривате данни от таблиците, индексите и таблиците стават фрагментирани, особено за базата данни, която има голям брой вмъквания, актуализации и изтривания.
Трето, операциите за вмъкване, актуализиране и изтриване създават неизползван блок от данни в отделните страници на базата данни. Това намалява броя на редовете, които могат да бъдат съхранени в една страница. Следователно, той увеличава броя на страниците, за да задържи таблица. Поради това увеличава разходите за съхранение на таблицата, отнема повече време за четене/запис и намалява производителността на кеша.
SQLite предоставя VACUUM
команда за справяне с трите проблема по-горе.
SQLite първо копира данни във файл на база данни във временна база данни. Тази операция дефрагментира обектите на базата данни, игнорира свободните места и преопакова отделни страници. След това SQLite копира съдържанието на временния файл на база данни обратно в оригиналния файл на базата данни. Оригиналният файл на базата данни е презаписан.
Тъй като VACUUM
командата възстановява базата данни, можете да я използвате, за да промените някои специфични за базата данни конфигурационни параметри, като размер на страницата, формат на страницата и кодиране по подразбиране. За да направите това, задавате нови стойности с помощта на pragma и след това почиствате базата данни с вакуум.
SQLite VACUUM
команда
VACUUM
командата не променя съдържанието на базата данни, освен стойностите на rowid. Ако използвате INTEGER PRIMARY KEY
колона, VACUUM
не променя стойностите на тази колона. Въпреки това, ако използвате rowid без псевдоним, VACUUM
командата ще нулира стойностите на rowid. Освен промяна на стойностите на rowid, VACUUM
командата също така изгражда индекса от нулата.
Добра практика е да се извърши VACUUM
командвайте периодично, особено когато изтривате големи таблици или индекси от база данни.
Важно е да се отбележи, че VACCUM
командата изисква съхранение, за да съхранява оригиналния файл, а също и копието. Също така VACUUM
командата изисква изключителен достъп до файла на базата данни. С други думи, VACUUM
командата няма да се изпълнява успешно, ако базата данни има чакащ SQL израз или отворена транзакция.
Понастоящем, от версия 3.9.2, можете да стартирате VACUUM
команда в main
база данни, а не прикачения файл с база данни.
Въпреки че SQLite активира режима на автоматично вакуумиране, който задейства процеса на вакуумиране автоматично с някои ограничения. Добра практика е да стартирате VACUUM
команда ръчно.
Как да стартирате SQLite VACUUM
команда
По-долу е показано как да стартирате VACUUM
команда:
VACUUM;
Code language: SQL (Structured Query Language) (sql)
Уверете се, че няма отворена транзакция, докато изпълнявате командата.
Следното изявление активира пълен автоматичен режим на вакуумиране:
PRAGMA auto_vacuum = FULL;
Code language: SQL (Structured Query Language) (sql)
За да активирате инкрементален вакуум, използвате следното изявление:
PRAGMA auto_vacuum = INCREMENTAL;
Code language: SQL (Structured Query Language) (sql)
Следното изявление деактивира режима на автоматично вакуумиране:
PRAGMA auto_vacuum = NONE;
Code language: SQL (Structured Query Language) (sql)
VACUUM
с INTO
клауза
Ето синтаксиса на VACUUM
с INTO
клауза:
VACUUM schema-name INTO filename;
Code language: SQL (Structured Query Language) (sql)
VACUUM
изявление с INTO
клаузата запазва оригиналния файл на базата данни непроменен и създава нова база данни с посоченото име на файла. Новата база данни ще съдържа същото логическо съдържание като оригиналната база данни, но напълно вакуумирана.
filename
в INTO
клаузата може да бъде всеки SQL израз, който се оценява на низ. Трябва да е път към несъществуващ файл или към празен файл, или VACUUM INTO
команда ще доведе до грешка.
VACUUM
командата е много полезна за генериране на резервни копия на жива база данни. Това е безопасно за транзакции, като генерираната база данни е последователна моментна снимка на оригиналната база данни. Ако обаче непланирано изключване или загуба на захранване прекъснат командата, генерираната база данни може да е повредена.
Следното изявление използва VACUUM INTO
команда за генериране на нова база данни с името на файла chinook_backup.db
чиито данни се копират от main
схема на chinook
база данни:
VACUUM main INTO 'c:\sqlite\db\chinook_backup.db';
Code language: JavaScript (javascript)
В този урок научихте защо трябва да използвате SQLite VACUUM
команда и как да я стартирате, за да оптимизирате базата данни.