Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чистка Interbase [D6, IB6.x]


Ptr ©   (2002-07-19 15:07:00) 

Уважаемые мастера! Как можно програмно вычистить базу INTERBASE?
(т.е. убрать старый мусор)


kaif   (2002-07-19 19:47:00) [1]

2 -=Sergeante=- © (19.07.02 16:38)
Может, я ошибаюсь в деталях, но подход именно такой. После массового удаления после Commit множество источников рекомендует сделать SELECT COUNT(*) (с соответствующим тормозом), иначе вновь подключившийся со своим SELECT наивный товарищ может заиметь большой тормоз и не понять, что происходит.


Desdechado   (2002-07-19 17:13:00) [2]

размер БД для SQL-сервера не настолько важен.
sweep в самом деле идет через определенное количество транзакций для версий записей, которые никого из транзакций уже не интересуют .
а то, что они физически остаются в БД, так это свободное место, которое будет занято позже. Причем так даже лучше, поскольку серверу надо доп. время на приращивание новых страниц к БД, если их не хватает. Так что нет повода для волнения.


-=Sergeante=-   (2002-07-19 16:38:00) [3]

Хм. Честно говоря, такое не слышал. Даже не подозревал, что такое может работать...

Пусть это работает с неподтверждёнными транзакциями. Но как тогда быть с уже удалёнными записями (с подстверждённой транзакцией)? Физически они остаются. Думаю в этом случае такой ход не подойдёт. Имхо.


kaif   (2002-07-19 16:22:00) [4]

2 -=Sergeante=- © (19.07.02 16:11)
IB использует так называемую корпоративнуючистку. Он организует транзакции через многоверсионный механизм. К примеру, ты стартуешь транзакцию и пытаешься делать UPDATE или DELETE. IB создает копию старой версии, которую видят другии транзакции до подтверждения твоей. Если ты не подтвердил свою транзакцию, твоя версия остается в базе в виде мусора и подчищается в процессе SELECT-а в новой транзакции. Так как некоторые записи могут никого не интересовать долгое время, их мусорные экземляры (вторые, третьи и т. д.) версии остаются лежать на страницах.
SELECT COUNT(*) позволяет просканировать таблицу и удалить все такие записи окончательно.
Как это ни странно, но это так.
Об этом можно почитать в сети на ib.demo.ru


-=Sergeante=-   (2002-07-19 16:11:00) [5]

2 kaif © (19.07.02 15:19)

> Мусор можно убирать с помощью SELECT COUNT(*) FROM <Table>.


???


Ptr   (2002-07-19 15:25:00) [6]

Спасибо kaif, хоть по человечески объяснил...


kaif   (2002-07-19 15:19:00) [7]

Программно никак. Только Backup-Restore. Кстати, можно это и из программы вызвать. Interbase не прячет записи. Просто он добавляет новые страницы. Кстати, не обязательно, чтобы база все время росла. Если страниц хватает и нет мусора, то она перестает расти (или растет очень медленно). Мусор можно убирать с помощью SELECT COUNT(*) FROM <Table>.


Alexandr   (2002-07-19 15:18:00) [8]

как все запущено...


Ptr   (2002-07-19 15:14:00) [9]

Извините за неточность. Interbase при удалении записей из таблицы не удаляет ее из базы, а только прячет. Т.е. при работе с базой она (база) все время увеличивается при том, что показывает 0 записей в таблице. Можно почитстить при "репликации", а мне хотелось бы программно. Вопрос понятен?


kalliopiy   (2002-07-19 15:11:00) [10]

Хорошо спросил! Точно!

А что ты под мусоромподразумеваешь? И как ее (БД) нужно чистить?


Наверх

Титульная страница Поиск, карта сайта Написать письмо