Поиск:

Ответ в темуСоздание новой темы Создание опроса
> добавление в таблицу БД 
:(
    Опции темы
NieL
Дата 15.3.2011, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть 2 таблицы БД

Categories (ID, Name)
Products (ID, Name, category_id)

Есть список, каждая запись которого является Categories.ID:

11
36
17
57
21
88
..

Задача: пройти по списку, проверя существование каждой записи в таблице Gategories, если существует добавить в таблицу Products новую запись назначив полю categories_id значение из списка. В списке около 15 000 записей, как сделать проверку и добавление максимально быстрым. Вот мой код, но выполняется все долго.

Код

procedure TForm2.Add(categories_ids: TStrings);
var
 field_category_id: TField;
 I, category_id: Integer;
begin
 field_category_id := tbl_products.FindByName('category_id');
 for I := 0 to categories_ids.Count - 1 do
 begin
   category_id := StrToInt(categories_ids[I]);
   // проверяем существование category_id в таблице tbl_categories
   if tbl_categories.FindKey([category_id]) then
   begin
     tbl_products.Append;
     try
       field_category_id.AsInteger := category_id;
       tbl_products.Post;
     except
       tbl_products.Cancel;
     end;

   end;

 end;

end;


Еще пытался делать через запросы (проверка (SELECT) и добавление (INSERT)) так вообще, в секунду по 2-3 записи добавляется.

Это сообщение отредактировал(а) NieL - 16.3.2011, 00:48
PM MAIL   Вверх
Vas
Дата 16.3.2011, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

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



БД какая?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
NieL
Дата 16.3.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



субд DBISAM

объясню все подробно:

Написал com-сервер для взаммодействия с базой данных приложения из 1C. В нем реализован метод add_product, который добавляет запись (товар) в таблицу базы данных, делает эту запись текущей и дальше с помощью других функций com-сервера человек может назначать значения полей для этой записи и так далее. Метод расчитан на добавление одной записи. Изначально алгоритм метода сводился к простому insert-запросу. Проблема в следующем: человек, который его использует из 1С в цикле добавляет 10000 записей, таким образом по сути выполнится 10000 запросов, у меня это занимает больше часа, если же делать через Table.Append, Table.Post время выполнения сокращается до 40-50 минут. В обоих случаях очень долго. Как оптимизировать затраты?
PM MAIL   Вверх
cat512
Дата 16.3.2011, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Необходимо определить где узкое место. Может проблема в медленной работе методов com-сервера. Проверить это просто. Берёшь профайлер "оборачивешь" методы com-сервера. Смотришь время. Берёшь "смотрелку" для бд. Выполняеш в ней тот же запрос (или пакетную вставку). Смотришь время. Таким образом определяешь "узкое место", а после работаешь над оптимизацией,
либо com-сервера (переделываешь на пакетную вставку), либо бд (смотришь какой уровень изоляции транзакций используется. по каким полям созданы индексы и т.д.)
PM MAIL   Вверх
interinna
Дата 13.11.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.11.2011
Где: Москва

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



Цитата

Необходимо определить где узкое место. Может проблема в медленной работе методов com-сервера. Проверить это просто. Берёшь профайлер "оборачивешь" методы com-сервера. Смотришь время. Берёшь "смотрелку" для бд. Выполняеш в ней тот же запрос (или пакетную вставку)Смотришь время. Таким образом определяешь "узкое место", а после работаешь над оптимизацией,
либо com-сервера (переделываешь на пакетную вставку), либо бд (смотришь какой уровень изоляции транзакций используется. по каким полям созданы индексы и т.д.)



Спасибо за совет
PM MAIL WWW   Вверх
Данкинг
Дата 13.11.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



interinna, у тебя проблемы с той же СУБД?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1143 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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