Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.19;
Скачать: CL | DM;

Вниз

Добавление в таблицу БД   Найти похожие ветки 

 
Scott Storch   (2011-03-15 23:36) [0]

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


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

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


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


> categories_ids: TStrings


> category_id: Integer;


>   category_id := categories_ids[I];


call me paranoid, but these quoted lines make me suspicious


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

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


 
sniknik ©   (2011-03-16 01:19) [4]

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

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


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


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

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


 
DiamondShark ©   (2011-03-16 10:53) [6]

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


 
MsGuns ©   (2011-03-16 14:34) [7]

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


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

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

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

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


 
sniknik ©   (2011-03-16 16:53) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2011.06.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1299761604
картман
2011-03-10 15:53
2011.06.19
почему точка останова не активна?


6-1234896883
Индеец
2009-02-17 21:54
2011.06.19
IdCookieManager не сохраняются куки


2-1299874810
Евгений_С
2011-03-11 23:20
2011.06.19
RxRichEdit


15-1298842202
Юрий
2011-02-28 00:30
2011.06.19
С днем рождения ! 28 февраля 2011 понедельник


4-1248249215
sektor
2009-07-22 11:53
2011.06.19
Добавление текста в RichEdit