Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
ВнизЧистка Interbase Найти похожие ветки
← →
Ptr (2002-07-19 15:07) [0]Уважаемые мастера! Как можно програмно вычистить базу INTERBASE?
(т.е. убрать старый мусор)
← →
kalliopiy (2002-07-19 15:11) [1]Хорошо спросил! Точно!
А что ты под мусоромподразумеваешь? И как ее (БД) нужно чистить?
← →
Ptr (2002-07-19 15:14) [2]Извините за неточность. Interbase при удалении записей из таблицы не удаляет ее из базы, а только прячет. Т.е. при работе с базой она (база) все время увеличивается при том, что показывает 0 записей в таблице. Можно почитстить при "репликации", а мне хотелось бы программно. Вопрос понятен?
← →
Alexandr (2002-07-19 15:18) [3]как все запущено...
← →
kaif (2002-07-19 15:19) [4]Программно никак. Только Backup-Restore. Кстати, можно это и из программы вызвать. Interbase не прячет записи. Просто он добавляет новые страницы. Кстати, не обязательно, чтобы база все время росла. Если страниц хватает и нет мусора, то она перестает расти (или растет очень медленно). Мусор можно убирать с помощью SELECT COUNT(*) FROM <Table>.
← →
Ptr (2002-07-19 15:25) [5]Спасибо kaif, хоть по человечески объяснил...
← →
-=Sergeante=- (2002-07-19 16:11) [6]2 kaif © (19.07.02 15:19)
> Мусор можно убирать с помощью SELECT COUNT(*) FROM <Table>.
???
← →
kaif (2002-07-19 16:22) [7]2 -=Sergeante=- © (19.07.02 16:11)
IB использует так называемую корпоративную чистку. Он организует транзакции через многоверсионный механизм. К примеру, ты стартуешь транзакцию и пытаешься делать UPDATE или DELETE. IB создает копию старой версии, которую видят другии транзакции до подтверждения твоей. Если ты не подтвердил свою транзакцию, твоя версия остается в базе в виде мусора и подчищается в процессе SELECT-а в новой транзакции. Так как некоторые записи могут никого не интересовать долгое время, их мусорные экземляры (вторые, третьи и т. д.) версии остаются лежать на страницах.
SELECT COUNT(*) позволяет просканировать таблицу и удалить все такие записи окончательно.
Как это ни странно, но это так.
Об этом можно почитать в сети на ib.demo.ru
← →
-=Sergeante=- (2002-07-19 16:38) [8]Хм. Честно говоря, такое не слышал. Даже не подозревал, что такое может работать...
Пусть это работает с неподтверждёнными транзакциями. Но как тогда быть с уже удалёнными записями (с подстверждённой транзакцией)? Физически они остаются. Думаю в этом случае такой ход не подойдёт. Имхо.
← →
Desdechado (2002-07-19 17:13) [9]размер БД для SQL-сервера не настолько важен.
sweep в самом деле идет через определенное количество транзакций для версий записей, которые никого из транзакций уже не интересуют .
а то, что они физически остаются в БД, так это свободное место, которое будет занято позже. Причем так даже лучше, поскольку серверу надо доп. время на приращивание новых страниц к БД, если их не хватает. Так что нет повода для волнения.
← →
kaif (2002-07-19 19:47) [10]2 -=Sergeante=- © (19.07.02 16:38)
Может, я ошибаюсь в деталях, но подход именно такой. После массового удаления после Commit множество источников рекомендует сделать SELECT COUNT(*) (с соответствующим тормозом), иначе вновь подключившийся со своим SELECT наивный товарищ может заиметь большой тормоз и не понять, что происходит.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c