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

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

оптимизация добавления в таблицу БД


handle ©   (2011-07-08 12:05:00) 


Groups     (Id, Name)
Categories (Id, Name, GroupId);

в таблицу Categories в цикле добавляется порядка 10000-30000 записей, перед добавлением необходимо проверять значение GroupId.


function TAdapter.Add(GroupId: Integer): Integer;
begin
 if not GroupIdIsValid(GroupId) then
   raise Exception.CreateResFmt(@InvalidGroupId, [GroupId]);
 FCategoriesQuery.SQL.Text := Format('INSERT INTO Categories (groupid) VALUES (%d)', [GroupId]);
 FCategoriesQuery.ExecSQL;
end;


function GroupIdExists(GroupId: Integer): Boolean;
begin
 FGroupsQuery.SQL.Text := Format('SELECT group_id FROM groups WHERE group_id = %d', [GroupId]);
 FGroupsQuery.Open;
 Result := FGroupQuery.RowsAffected > 0;
end;


Процесс добавления выполняется очень долго (порядка 15 минут). Если добавление и проверку делать через компонет таблицу (Append, Post, Cancel), поиск (FindKey) на все уходит 3-5 минут. Почему такие затраты времени, если использовать sql-хапросы? Помогите с оптимизацией.


YurikGL   (2011-07-08 20:00:00) [1]

Пардон, в коде вставил проверку на ошибку вставки

AdoDataset CommandText:='Insert into table (c1,c2) vaules (:v1,:v2)';
For i:=1 to n do begin //это и есть твой цикл
AdoDataset.ParamByName(v1):=SourceMas1[i]
AdoDataset.ParamByName(v2):=SourceMas2[i]
try
AdoDataSet.Execute
Except
Showmessage('сообщение об ошибке');
end
End;


YurikGL   (2011-07-08 19:58:00) [2]

1) Использовать AdoDataset

2) Проверку уникальности сделать в базе данных (сделать уникальный ключ на соответствующее поле)

3) Делать как-то так
AdoDataset CommandText:='Insert into table (c1,c2) vaules (:v1,:v2)';
For i:=1 to n do begin //это и есть твой цикл
AdoDataset.ParamByName(v1):=SourceMas1[i]
AdoDataset.ParamByName(v2):=SourceMas2[i]
AdoDataSet.Execute
End;

p.s. Делфи под рукой нет, так что синтаксис может быть неверен.


DiamondShark   (2011-07-08 15:42:00) [3]


> GroupIdIsValid нужен для того, чтобы вместо стандартного
> сообщения об ошибке выводилось мое (это одно из требований
> в тз).

Звезда в шоке.


function TAdapter.Add(GroupId: Integer): Integer;
begin
 try
   FCategoriesQuery.SQL.Text := Format('INSERT INTO Categories (groupid) VALUES (%d)', [GroupId]);
   FCategoriesQuery.ExecSQL;
 except
   raise Exception.CreateResFmt(@InvalidGroupId, [GroupId]);
 end
end;

Например.

Как домашнее задание остаётся проверка на то, что возникшее при исполнении INSERT исключение -- это именно нарушение уникальности.

Следующая ступень просветления -- запрос с параметрами.


Anatoly Podgoretsky   (2011-07-08 13:00:00) [4]


> ну у меня опыта не сколько сколько у вас, пока что ничего
> лучшего чем использовать TADOTable не придумал.

Ужас


Dennis I. Komarov   (2011-07-08 12:44:00) [5]


> TADOTable не придумал.

ТАБУРЕТКА!!! :)

P.S.
  Поюзайте поиск на предмет сего...


handle   (2011-07-08 12:34:00) [6]

ну у меня опыта не сколько сколько у вас, пока что ничего лучшего чем использовать TADOTable не придумал.


Медвежонок Пятачок   (2011-07-08 12:29:00) [7]

тут в любом случае на каждое добавление - отдельный запрос.

Для школьника - в любом случае.
Для программиста - не в любом.
Но для этого надо хоть совсем немного ума.


handle   (2011-07-08 12:25:00) [8]

задача такая, написать api для взаимодействия с бд приложения из 1C. проблема только с функцией добавления - пользователь пробегает по справочнику товаров в 1С и через мой ком-объект, содержащий функцию Add - добавляет товары в БД приложения. тут в любом случае на каждое добавление - отдельный запрос. Как можно оптимизировать затраты.

СУБД - MS Access

GroupIdIsValid нужен для того, чтобы вместо стандартного сообщения об ошибке выводилось мое (это одно из требований в тз).


RWolf   (2011-07-08 12:15:00) [9]

то, чем занимается GroupIdExists, называется ссылочная целостность и по уму должно быть прописано в структуре БД, программе этим заниматься незачем.


Медвежонок Пятачок   (2011-07-08 12:12:00) [10]

.... да еще и sql без параметров.

нет, пора строить завод по сжиганию программистов.


Медвежонок Пятачок   (2011-07-08 12:10:00) [11]

тридцать тысяч отдельных селектов с клиента для проверки кажного инсерта.
это сурово.


RWolf   (2011-07-08 12:08:00) [12]

индексов нет, видимо.


Наверх

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