![]() |
|
|
![]()
|
|
| GrigoriyFomin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 16.11.2010 Репутация: нет Всего: нет |
Подскажите, использую Delphi XE, IBDAC и FireBird 2.5
Вставляю в пустую базу под 20000 записей - база раздувается до 1,2 гигов. Вставляю с помощью TIBCTable.Append. Если базу сжать - она сжимается до 400 мБ. Как сделать, чтоб вставка/обновление записей не раздувало так базу? AutoCommit стоит. Использовать после этого backup и restore не подходит. |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Данные берутся из внешнего источника?
Что мешает делать бекап/рестор после таких вставок? |
|||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
А если обычными IBX вставлять данные? У нас на работе таблица в FB примерно 9.5 млн записей. Не знаю её размера (после каникул посмотрю, если не забуду), но если бы она увеличивалась такими темпами, то никакого места не хватило бы.
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
ошибка в 17ой строке
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Если достать свой хрустальный шар попробовать отгадать, то, возможно, ведётся неправильная работа с транзакциями. А так... жди настоящих телепатов, пусть отгадывают твой код.
|
|||
|
||||
| GrigoriyFomin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 16.11.2010 Репутация: нет Всего: нет |
я ж говорю - данные вставляются ibctable.edit/ ibctable.append и завершаются по Post. Делать бэкап и рестор не подходит. Вставляется за раз много данных, но почему-то размер после вставки и после сжатия отличается в 3 раза. Я просто хочу узнать, как вставлять, чтоб не образовывалось лишнего "мусора", мож какие-то галки поставить?
Возможно, дело и в транзакциях, я с ними не работал. Это сообщение отредактировал(а) GrigoriyFomin - 8.1.2011, 15:49 |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Это ни о чем не говорит. Так, на вскидку - зачем там edit если данные вставляются... Без кода это все бессмысленно... Убери AutoCommit и комить данные сам, после вставки всех записей. (это в качестве сеанса телепатии) Можешь еще почитать про такие методы фибов - ссылка. Это сообщение отредактировал(а) superVad - 9.1.2011, 12:52 |
|||
|
||||
| GrigoriyFomin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 16.11.2010 Репутация: нет Всего: нет |
Если поможет, привожу код, который формирует пакет
|
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
||||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
А что интересного в триггерах? Может там есть код, который тоже параллельно что-то удаляет?
Ты работаешь с блобами? Ты не говорил этого. Советую почитать про блобы. Как их правильно создавать, с какими размерами и т.д. Имеет значение также размер страницы в базе, размер кластера (или сектора, уже не помню) на HDD. Например, размер сектора должен совпадать с размером страницы в базе. |
|||
|
||||
| GrigoriyFomin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 16.11.2010 Репутация: нет Всего: нет |
Меня смутило именно то, что вставка в пустую базу записей ведет к какому-то резервированию места в базе, непонятно зачем. Попробую завтра с коммитами поиграться - отпишусь
|
|||
|
||||
| GrigoriyFomin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 16.11.2010 Репутация: нет Всего: нет |
Спасибо за наводку, убрал автокоммит и делаю коммит после всех вставок - размер не уменьшился, но скорость работы увеличилась в 2,5 раза!!!!
А вот как правильно делать starttransaction и commit для Connection, если к нему подключена куча активных IBCQuery? После коммита они сбрасываются? Это надо их обновлять? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
commitretaining спасёт гиганта мысли
Добавлено через 20 секунд RTFM про транзакции Добавлено через 2 минуты и 49 секунд
Я тебе ещё раз поясняю (на пальцах): вот ты начал добавлять новую запись, а она не влазит на страницу базы данных, и при этом создаётся новая страница, т.е. каждая твоя новая запись размещается на двух страницах, вместо одной. Это не отверждение, это - предположение. Второе. Ты добавил запись, в этот момент триггером где-то была удалена запись, в другой таблице или ещё как-то. Сразу место при удалении записи НЕ освобождается. |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
GrigoriyFomin, вообще хорошим тоном считается использование отдельной транзакции на чтение и отдельной на запись.
Ты можешь использовать еще одну транзакцию в своем импорте. Ну или как написал Akella - CommitRetaining еще никто не отменял. (это если нужно держать транзакцию открытой, у себя лучше проверь) Это сообщение отредактировал(а) superVad - 11.1.2011, 10:11 |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
После commit'а все датасет'ы закрываются, но это зависит от реализации в конкретных компонентах. commitretaining использовать не советую, только если нет возможности использовать вторую транзакцию, но это редко. В твоем коде commit можно ставить после выхода из цикла while not qMain.Eof do И напоследок читать www.ibase.ru. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |