Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FireBird - вставка большого количества записей 
:(
    Опции темы
GrigoriyFomin
Дата 7.1.2011, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

Репутация: нет
Всего: нет



Подскажите, использую Delphi XE, IBDAC и FireBird 2.5
Вставляю в пустую базу под 20000 записей - база раздувается до 1,2 гигов. Вставляю с помощью TIBCTable.Append.  Если базу сжать - она сжимается до 400 мБ. Как сделать, чтоб вставка/обновление записей не раздувало так базу? AutoCommit стоит. Использовать после этого backup и restore не подходит.
PM MAIL   Вверх
superVad
Дата 8.1.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Данные берутся из внешнего источника?

Что мешает делать бекап/рестор после таких вставок?
PM MAIL   Вверх
Данкинг
Дата 8.1.2011, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



А если обычными IBX вставлять данные? У нас на работе таблица в FB примерно 9.5 млн записей. Не знаю её размера (после каникул посмотрю, если не забуду), но если бы она увеличивалась такими темпами, то никакого места не хватило бы.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Akella
Дата 8.1.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



ошибка в 17ой строке
PM MAIL   Вверх
Akella
Дата 8.1.2011, 10:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Если достать свой хрустальный шар попробовать отгадать, то, возможно, ведётся неправильная работа с транзакциями. А так... жди настоящих телепатов, пусть отгадывают твой код.
PM MAIL   Вверх
GrigoriyFomin
Дата 8.1.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

Репутация: нет
Всего: нет



я ж говорю - данные вставляются ibctable.edit/ ibctable.append и завершаются по Post. Делать бэкап и рестор не подходит. Вставляется за раз много данных, но почему-то размер после вставки и после сжатия отличается в 3 раза. Я просто хочу узнать, как вставлять, чтоб не образовывалось лишнего "мусора", мож какие-то галки поставить?
Возможно, дело и в транзакциях, я с ними не работал. 

Это сообщение отредактировал(а) GrigoriyFomin - 8.1.2011, 15:49
PM MAIL   Вверх
superVad
Дата 9.1.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Цитата(GrigoriyFomin @  8.1.2011,  15:47 Найти цитируемый пост)
я ж говорю - данные вставляются ibctable.edit/ ibctable.append и завершаются по Post

Это ни о чем не говорит.
Так, на вскидку - зачем там edit если данные вставляются... Без кода это все бессмысленно...

Убери AutoCommit и комить данные сам, после вставки всех записей. (это в качестве сеанса телепатии)

Можешь еще почитать про такие методы фибов - ссылка.

Это сообщение отредактировал(а) superVad - 9.1.2011, 12:52
PM MAIL   Вверх
GrigoriyFomin
Дата 9.1.2011, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

Репутация: нет
Всего: нет



Если поможет, привожу  код, который формирует пакет

Код

    ibconMain.GetTableNames(tablelist);

    for i := 0 to tablelist.Count - 1 do
    begin
      tUpd.Active := false;
      qMain.Active := false;
      tUpd.TableName := tablelist[i];
      qMain.SQL.Text := 'select * from ' + tablelist[i];
      tUpd.Active := true;
      if tUpd.Fields.FindField('LASTDATE') <> nil then
      begin
        qMain.SQL.Add('where LASTDATE >''' + datetostr(d) + '''');
      end
      else if tUpd.Fields.FindField('EDATE') <> nil then
      begin
        qMain.SQL.Add('where EDATE >''' + datetostr(d) + '''');
      end;
      qMain.Active := true;
      addlog(tablelist[i] + ': ' + inttostr(qMain.RecordCount) + ' recors');
      while not qMain.Eof do
      begin
        tUpd.Active := true;
        tUpd.append;
        for i1 := 0 to qMain.FieldCount - 1 do // Перебираем и переносим все поля
        begin
          if qMain.Fields[i1].IsBlob then tUpd.Fields[i1].AsBytes := qMain.FieldByName(qMain.Fields[i1].DisplayName).AsBytes
          else tUpd.Fields[i1].Value := qMain.FieldByName(qMain.Fields[i1].DisplayName).Value;
        end;
        tUpd.post;
        qMain.Next;
      end;
    end;

PM MAIL   Вверх
superVad
Дата 10.1.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



GrigoriyFomin, 

Цитата(superVad @  9.1.2011,  12:47 Найти цитируемый пост)
Убери AutoCommit и комить данные сам, после вставки всех записей.


пробовал?
PM MAIL   Вверх
Akella
Дата 10.1.2011, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



А что интересного в триггерах? Может там есть код, который тоже параллельно что-то удаляет?

Цитата(GrigoriyFomin @  9.1.2011,  23:36 Найти цитируемый пост)
.IsBlob

Ты работаешь с блобами? Ты не говорил этого. Советую почитать про блобы. Как их правильно создавать, с какими размерами и т.д. 
Имеет значение также размер страницы в базе, размер кластера (или сектора, уже не помню) на HDD. Например, размер сектора должен совпадать с размером страницы в базе.
PM MAIL   Вверх
GrigoriyFomin
Дата 10.1.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

Репутация: нет
Всего: нет



Меня смутило именно то, что вставка в пустую базу записей ведет к какому-то резервированию места в базе, непонятно зачем. Попробую завтра с коммитами поиграться - отпишусь
PM MAIL   Вверх
GrigoriyFomin
Дата 10.1.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

Репутация: нет
Всего: нет



Спасибо за наводку, убрал автокоммит и делаю коммит после всех вставок - размер не уменьшился, но скорость работы увеличилась в 2,5 раза!!!!
А вот как правильно делать starttransaction и commit для Connection, если к нему подключена куча активных IBCQuery? После коммита они сбрасываются? Это надо их обновлять?

PM MAIL   Вверх
Akella
Дата 11.1.2011, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



commitretaining спасёт гиганта мысли  smile

Добавлено через 20 секунд
RTFM про транзакции  smile

Добавлено через 2 минуты и 49 секунд
Цитата(GrigoriyFomin @  10.1.2011,  22:16 Найти цитируемый пост)
Меня смутило именно то, что вставка в пустую базу записей ведет к какому-то резервированию места в базе

Я тебе ещё раз поясняю (на пальцах): вот ты начал добавлять новую запись, а она не влазит на страницу базы данных, и при этом создаётся новая страница, т.е. каждая твоя новая запись размещается на двух страницах, вместо одной. Это не отверждение, это - предположение.

Второе. Ты добавил запись, в этот момент триггером где-то была удалена запись, в другой таблице или ещё как-то. Сразу место при удалении записи НЕ освобождается.
PM MAIL   Вверх
superVad
Дата 11.1.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



GrigoriyFomin, вообще хорошим тоном считается использование отдельной транзакции на чтение и отдельной на запись.
Ты можешь использовать еще одну транзакцию в своем импорте.

Ну или как написал Akella - CommitRetaining еще никто не отменял. (это если нужно держать транзакцию открытой, у себя лучше проверь)

Это сообщение отредактировал(а) superVad - 11.1.2011, 10:11
PM MAIL   Вверх
Deniz
Дата 11.1.2011, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(GrigoriyFomin @  11.1.2011,  01:09 Найти цитируемый пост)
А вот как правильно делать starttransaction и commit для Connection, если к нему подключена куча активных IBCQuery? После коммита они сбрасываются? Это надо их обновлять?
После commit'а все датасет'ы закрываются, но это зависит от реализации в конкретных компонентах.
commitretaining использовать не советую, только если нет возможности использовать вторую транзакцию, но это редко.
В твоем коде commit можно ставить после выхода из цикла  while not qMain.Eof do
И напоследок читать www.ibase.ru.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.