Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];
ВнизДобавление в таблицу БД Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c