Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1300117377
HannibalSmith23
2011-03-14 18:42
2011.06.19
Задача Delphi


15-1298669393
Юрий
2011-02-26 00:29
2011.06.19
С днем рождения ! 26 февраля 2011 суббота


2-1300183147
Avil
2011-03-15 12:59
2011.06.19
Mysql stored proc, записи в цикле


6-1238266942
mreg
2009-03-28 22:02
2011.06.19
Пример отправки post запроса + ответ на Winapi


15-1298894649
Baks
2011-02-28 15:04
2011.06.19
Вопрос про цикл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский