SQLRU.net
Разработка приложений баз данных

Сегодняшние сообщения (вкл)  | Сообщения без ответа (откл)

Форум: Delphi
 Тема: FMX Grid
Re: FMX Grid [сообщение #5044 является ответом на сообщение #5036] Wed, 15 May 2024 07:40
fraks в настоящее время не в онлайне  fraks
Сообщений: 112
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
МП писал(а) Tue, 14 May 2024 18:09
у нас местами DevExpress (ненавижу!).
так у него свой контейнер данных.
со своим форматированием, локальной сортировкой,
встроенными агрегатными функциями и т.д., и т.п.
в общем, грёбанный монструозный фреймворк, а не йогурт...
Во времена D1, D2 пощупал датасеты, понял что идеология весьма странна, и с тех пор у меня тоже свой контейнер данных, со своим форматированием (при выводе в виртуальные гриды), локальной сортировкой и т.п.
Функционал по минимуму, но не нужно бороться с чужими монструозными компонентами и идеологиями, для работы с данными.
Форум: Firebird, HQbird, InterBase
 Тема: Очищение старых данных в мультифайловой БД
Re: Очищение старых данных в мультифайловой БД [сообщение #5045 является ответом на сообщение #5031] Wed, 15 May 2024 07:55
fraks в настоящее время не в онлайне  fraks
Сообщений: 112
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
TheKeeper писал(а) Tue, 14 May 2024 17:04
Здравствуйте. У меня возникла такая проблема, не могу найти решение.

Мы используем Firebird с ALTER DATABASE ADD FILE. У меня возникла проблема, что я не вижу способа оперативно освободить место на жёстком диске. Я могу удалить старые данные, но физически место не очищается. gfix sweep тоже не решает проблему. Через некоторое время я просто упрусь в потолок места на жёстком диске.

Можно решить проблему через gbak backup/gbak restore, но это требует остановки работы базы данных на долгий период времени, что может быть неприемлимым.

Есть ли возможность:
* Очистить место из БД на горячую, во время работы, удалив какие-то старые данные?
* Если нет, то хотя бы остановить БД лишь на небольшой промежуток времени, чтобы быстренько переформатировать не всю БД, а лишь файл с удалёнными данными?

ИМХО ты не там видишь проблему и борешься не с тем с чем надо.

Непонятно зачем тебе ALTER DATABASE ADD FILE. У вас такая база что на один раздел не влазит?

Файл базы может только расти, уменьшаться не может, кроме как пересоздать базу через Backup/Restore посредством gbak.
При ADD FILE, насколько я помню, сам не пользовался, нужно сразу задавать размер файла, и он не будет меняться.

Вобщем, смысл в следующем. Когда ты удаляешь данные в базе, командой DELETE FROM, то фактически данные не удаляются а помечаются как удаленные.
Место от этих данных базой будет использовано для новых данных, если эти помеченные кто-то или что-то проверит на никомуненужность Smile
Обычно, для того что бы сразу после удаления освободить место, нужно прочитать только что удаленное.
Я делаю примерно так:

DELETE FROM TABLE WHERE (УСЛОВИЕ);
COMMIT;
SELECT COUNT(*) FROM TABLE WHERE (УСЛОВИЕ);
COMMIT;

Count(*) естественно выдаст 0, на подсчет уйдет какое-то то время, т.к. сервер будет проверять каждую найденную (удаленную) версию записи на предмет нужна ли она кому-нибудь, и если обнаружит что не нужна - удалит ее, освободит место для дальнейшего использования.

Естественно, тут еще может быть масса всяких тонкостей, например транзакция может быть запущена "без сборки мусора" - тогда count(*) так же выдаст 0 но место не свободится.
Или у кого-то запущена длинная транзакция в которой он читает эти удаленные записи, и пока та транзакция не завершится, эти данные будут для нее хранится. Опять же, это зависит от уровня изоляции транзакции и т.п.

Вобщем, тебе нужно читать на ibase.ru статьи про версионность и транзакции.
И, возможно, придется переделать приложение что бы работало корректно с транзакциями.



Текущее время: Wed May 15 13:16:28 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00955 секунд