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

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

Добавление в таблицу БД


Scott Storch ©   (2011-03-15 23:36:00) 

Есть 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 := 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 записи добавляется.


sniknik   (2011-03-16 16:53:00) [1]

> Как оптимизировать затраты?
сведи все не к
> к простому insert-запросу.
а к сложному... чтобы
> используй команды массовых, а не одиночных обработок записей.


Scott Storch   (2011-03-16 15:46:00) [2]

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

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

используется СУБД DBISAM.


MsGuns   (2011-03-16 14:34:00) [3]

;)
Для этого надоть сиквель знать. А это уже, судя по [0], зело великая тайна для автора


DiamondShark   (2011-03-16 10:53:00) [4]

Я бы сделал так:
- создал бы временную таблицу
- забубенил бы туда список
- всё остальное выполнил бы SQL-скриптом


Германн   (2011-03-16 02:12:00) [5]


> Scott Storch   (16.03.11 00:44) [3]
>
> писал на скорую руку, чтобы показать как делаю в общих чертах

Используя при этом "ковровую бомбёжку"
http://forum.vingrad.ru/forum/topic-324808.html
А на sql.ru спросил?


sniknik   (2011-03-16 01:19:00) [6]

используй параметры. используй sql. используй команды массовых, а не одиночных обработок записей.

это ответ на скорую руку, чтобы показать как надо делать в общих чертах.


Scott Storch   (2011-03-16 00:44:00) [7]

писал на скорую руку, чтобы показать как делаю в общих чертах


Игорь Шевченко   (2011-03-16 00:20:00) [8]


> categories_ids: TStrings


> category_id: Integer;


>   category_id := categories_ids[I];


call me paranoid, but these quoted lines make me suspicious


MsGuns   (2011-03-16 00:13:00) [9]

Ховайся в жито <8( )


Наверх

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