Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADO Query + DB Access - слишком долго 
V
    Опции темы
Viy_2007
Дата 28.2.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Доброго времени суток.
Ситуация следующая: при помощи ADO Query добавляю большое количество записей в БД Access. Так добавление порядка 17000 записей выполняется 10-12 минут. После чего у меня возник вопрос, это нормально или всё же я что-то наплужил в коде? И сразу же вопрос: как можно ускорить этот процесс? Возможно лучше взять другой компонент?
Заранее спасибо.
PM MAIL   Вверх
Данкинг
Дата 28.2.2008, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



От числа полей тоже зависит. А ADO для Access  - самое оно ИМХО.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Rodman
Дата 28.2.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



Аксесс не предназначен для большого кол-ва данных...

вот оттуда и тормоза!!!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Savek
Дата 28.2.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(Rodman @  28.2.2008,  13:30 Найти цитируемый пост)
Аксесс не предназначен для большого кол-ва данных...

Согласен, но 17000 это маленький объем, даже если перед добавлением там уже было 170 000 записей


Viy_2007, что и как добавляешь, давай подробнее
PM MAIL   Вверх
Viy_2007
Дата 28.2.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



11 полей в каждой записи. не думал что для аксесса 17000 - это большое количество данных... ну а может посоветуете какую-нибдуь локальную бд для таких объёмов?

Добавлено @ 16:50
Ну вообщем вот пример цикла которым я добавляю записи в БД:

Код

// names, OldNames: TStringList;
for i := 0 to names.Count - 1 do
    begin
      f := true;
      j := 0;
      while f and (j <= OldNames.Count - 1) do
        if names.Strings[i] = OldNames.Strings[j]
          then
            f := false
          else
            j := j + 1;
      if f
        then
          begin
            Form1.ADOQuery1.SQL.Clear;
            Form1.ADOQuery1.SQL.Add('INSERT INTO Tb(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) VALUES ("*", "*", "*", "*", "*", "*", "*", "*", "*", "*", "*");');
            try
              Form1.ADOQuery1.ExecSQL;
            except
              MessageDlg('Error! Can not update the DataBase.', mtError, [mbOk], 0);
              exit;
            end;
          end;
    end;


В запросе сначала использовал параметры, но потом ради эксперимента изменил на редактирование строк ("*" - это на самом деле текстовые данные), ситуация не изменилась. Кто что скажет?

P.s. На момент тестирования OldNames.Count  было равно 0.

Это сообщение отредактировал(а) Viy_2007 - 28.2.2008, 17:05
PM MAIL   Вверх
Savek
Дата 29.2.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



1. Значительного увеличения производительности можно добиться заменой цикла на запрос вида
 
Код

Insert into ... select from ...

т.е. вставка всех записей 1-м запросом (не всегда возможна)
2. Замена AdoQuery на ADOCommand даст ощутимое увеличение скорости
3. Обязательно использование параметров и "припарка" запроса:
Код

with ADOCommand do begin
CommandText:='insert ... (:p1,:p2...)'
Prepared:=true;

//теперь используем в цикле
while ..... do begin
Parameters.ParamByName('p1').value:=Value;
...
Execute;

end;

PM MAIL   Вверх
Viy_2007
Дата 1.3.2008, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Спасибо Savek, пункты 2 и 3 действительно помогли. Теперь добавление свелось до 1 минуты. Но у меня возникло ещё два вопроса:
1. почему если сразу же после добавления этих записей сделать SELECT таблицы то записи не будут видны? (я конечно догадываюсь что это такая задержка на обновление, но тогда как это можно преодолеть?)
2. какими методами объекта ADOCommand можно получить результат возвращаемый запросом SELECT? (аналог ADOQuery.FieldByName('Name').AsString)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.