SQLite удаляет последние 25% записей в базе данных - PullRequest
5 голосов
/ 26 мая 2010

Я использую базу данных SQLite для хранения значений из регистратора данных. Регистратор данных в конечном итоге заполнит все доступное пространство на жестком диске компьютера. Я ищу способ удалить последние 25% журналов из базы данных, как только она достигает определенного предела.

Используя следующий код:

$ret = Query( 'SELECT id as last FROM data ORDER BY id desc LIMIT 1 ;' ); 
$last_id = $ret[0]['last'] ; 
$ret = Query( 'SELECT count( * ) as total FROM data' );
$start_id = $last_id - $ret[0]['total'] * 0.75 ; 
Query( 'DELETE FROM data WHERE id < '. round( $start_id, 0 ) );

Рядом с базой данных создается файл журнала, который заполняет оставшееся место на диске до тех пор, пока сценарий не будет выполнен.

Как / можно ли остановить создание этого файла журнала? В любом случае, чтобы объединить все три SQL-запроса в одну инструкцию?

1 Ответ

2 голосов
/ 26 мая 2010

Если журнал является единственной причиной проблемы, вы можете попытаться заставить SQLite вести журнал в памяти или просто отключить его.

С Документы :

PRAGMA journal_mode;
PRAGMA database.journal_mode;
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | ПАМЯТЬ | OFF
PRAGMA database.journal_mode = DELETE | TRUNCATE | PERSIST | ПАМЯТЬ | OFF

Эта прагма запрашивает или задает режим журнала для баз данных, связанных с текущим соединением с базой данных.

Первые две формы этой прагмы запрашивают текущий режим ведения журнала. В первой форме возвращается значение journal_mode по умолчанию. Режим журналирования по умолчанию - это режим, используемый базами данных, добавленными к соединению последующими инструкциями ATTACH. Вторая форма возвращает текущий режим ведения журнала для конкретной базы данных.

Последние две формы меняют режим ведения журнала. Четвертая форма изменяет режим ведения журнала для конкретного подключения к базе данных. Используйте «main» для основной базы данных (базы данных, которая была открыта исходным вызовом интерфейса sqlite3_open (), sqlite3_open16 () или sqlite3_open_v2 ()) и используйте «temp» для базы данных, содержащей таблицы TEMP. Третья форма изменяет режим ведения журнала во всех базах данных и изменяет режим ведения журнала по умолчанию, который будет использоваться для новых баз данных, добавленных последующими командами ATTACH. Новый режим журнала возвращается. Если режим журнала не может быть изменен, возвращается исходный режим журнала.

Режим журналирования DELETE - это нормальное поведение. В режиме DELETE журнал отката удаляется при завершении каждой транзакции. Действительно, операция удаления - это действие, которое вызывает транзакцию для фиксации. (Дополнительные сведения см. В документации под названием «Атомная фиксация в SQLite».)

Режим ведения журнала TRUNCATE фиксирует транзакции, обрезая журнал отката до нулевой длины вместо его удаления. Во многих системах усечение файла выполняется намного быстрее, чем удаление файла, поскольку содержащий каталог не нужно изменять.

Режим ведения журнала PERSIST предотвращает удаление журнала отката в конце каждой транзакции. Вместо этого заголовок журнала перезаписывается нулями. Это предотвратит откат других подключений к базе данных. Режим журналирования PERSIST полезен в качестве оптимизации на платформах, где удаление или усечение файла намного дороже, чем перезапись первого блока файла нулями.

Режим ведения журнала MEMORY сохраняет журнал отката в энергозависимой памяти. Это экономит дисковый ввод-вывод, но за счет безопасности и целостности базы данных. Если приложение, использующее SQLite, аварийно завершает работу в середине транзакции, когда установлен режим ведения журнала MEMORY, файл базы данных, скорее всего, будет поврежден.

Режим журналирования OFF полностью отключает журнал отката. Журнал отката никогда не создается, и, следовательно, журнал отката никогда не удаляется. Режим журналирования OFF отключает атомарные возможности фиксации и отката SQLite. Команда ROLLBACK больше не работает; он ведет себя неопределенным образом. Приложения должны избегать использования команды ROLLBACK, когда режим журнала выключен. Если сбой приложения происходит в середине транзакции, когда установлен режим журналирования OFF, файл базы данных, скорее всего, испортится.

Обратите внимание, что journal_mode для базы данных в памяти имеет значение MEMORY или OFF и не может быть изменено на другое значение. Попытка изменить параметр journal_mode базы данных в памяти на любой параметр, отличный от MEMORY или OFF, игнорируется. Также обратите внимание, что journal_mode нельзя изменить, пока транзакция активна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...