Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2014, 11:40   #1
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию Скорость работы Access

Проблема переход с Парадокс на Access.
Катастрофическое замедление работы.
Ситуация. Таблица парадокс имеет 300 000 записей. Создал ее копию в аксесе.
Задача: в одно поле ввести последовательно число от 1 до упора.
вот такой код обработки двух кнопок.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var D1,D2:Cardinal;
S:longint;
begin
	S:=0;
	T1.Open;
	D1:=Gettickcount;
	while not T1.Eof do begin
		inc(S);
		T1.Edit;
		T1.FieldByName('lev').AsInteger:=S;
		T1.Next;
	end;
	D2:=Gettickcount;
	E1.Text:=IntToStr(D1);
	E2.Text:=IntToStr(D2-D1);
	T1.Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var D1,D2:Cardinal;
S:longint;
begin
	S:=0;
	AT1.Open;
	D1:=Gettickcount;
	while not AT1.Eof do begin
		inc(S);
		AT1.Edit;
		AT1.FieldByName('lev').AsInteger:=S;
		AT1.Next;
	end;
	D2:=Gettickcount;
	E3.Text:=IntToStr(D1);
	E4.Text:=IntToStr(D2-D1);
	AT1.Close;
end;
Первая кнопка обработка таблицы Paradox, через Ttable.
1500 тиков.
Вторая кнопка Access через ADOTable.
После 20 минут ожидания вырубил, посмотрел - изменено чуть более 100 000 записей.
Вопрос: это так access работает вообще или есть что то, чего я не знаю.
Комп мощный.
beringoff вне форума Ответить с цитированием
Старый 16.06.2014, 11:52   #2
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

через SQL попробуй
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 16.06.2014, 11:59   #3
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Как через SQL увеличивать значение вводимое в поле?
beringoff вне форума Ответить с цитированием
Старый 16.06.2014, 12:03   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для начала посмотреть какие индексы у таблицы в базе есть. И не понятен смысл нумерации
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.06.2014, 12:07   #5
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Из индексов только ключевое поле.
Задача нумерации - именно проверить быстродействие, т.к. задачи решаемые влет на старой базе, на новой требуют многих минут.
Простой тестовый пример привел меня в шок.
beringoff вне форума Ответить с цитированием
Старый 16.06.2014, 12:42   #6
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

если у тебя уже есть таблица с определённым колилчеством записей можно попробовать сделать следующее:
Код:
 for i:=0 to AT1.recordcount-1 do
   begin
    Application.ProcessMessage;
     sql:='update [table_name]'+#13+
             'set lev='+inttostr(i)+#13+
            'where nomer='+inttostr(i);
     adocommand1.commandtext:=sql;
     adoconnection1.beginTrans;
     try
       adocommand1.execute;
       adoconnection1.commitTrans; 
     except 
       adoconnection1.rollbackTrans;
     end; 
   end;

ну а если таблица не заполнена:
Код:
 for i:=0 to <колличество_вставляемых_данных> do
   begin
     application.processMessage;
     sql:='insert into [table_name] (lev)'+#13+
            'values('+inttostr(i)+')';
     adocommand1.commandText:=sql;
     adoconnection1.beginTrans;
     try
      adocommand1.execute;
      adoconnection1.committrans;
     except
       adoconnection1.rollbackTrans;
     end; 
   end;
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 16.06.2014, 14:29   #7
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Dark_Spirit, спасибо, но не то.
Нет в таблице поля для where, все будет писаться в одну строку.

Нужно тупо проставить нумератор. Конечная задача: периодически запоминать местоположение записи в списке, которое будет меняться в соответствии с изменением определенного поля, по местоположению будет строится график.
Во время создания одного отчета, местоположение записи может меняться до 20 раз. На парадоксе все это проходит за полторы минуты.
В аксесе зависло на часы.
beringoff вне форума Ответить с цитированием
Старый 16.06.2014, 14:34   #8
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Я покопался и выяснил, что ADO при каждой записи изменении переходе и т.д. генерирует туеву хучу различных событий и вызывает несколько методов на каждое событие, поэтому такие тормоза.
Может есть какой-то способ обойти все эти генерации????
beringoff вне форума Ответить с цитированием
Старый 16.06.2014, 14:46   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Уникальный ключ надеюсь есть в таблице.

1. Запросом создать временную таблицу с этим ключем + автоинкремент от 1.
2. Запросом обновить поле исходной таблицы используя автонкремент из временной
3. Удалить временную

По всякому быстрей будет, но в первую очередь отказался бы вообще от перенумерации записей. Нумерацию можно и на весу делать SELECT-ом или на клиенте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.06.2014, 14:49   #10
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

А можно вот об этом:
Цитата:
Сообщение от Аватар Посмотреть сообщение
Нумерацию можно и на весу делать SELECT-ом или на клиенте
попдробнее? Плиз.
beringoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скорость работы по сети Dux Работа с сетью в Delphi 5 09.10.2013 22:39
Скорость работы программ в DOS assume Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 12 19.02.2013 13:27
Скорость работы с базой данных Linel PHP 3 17.06.2011 21:50
Скорость работы различных СУБД _SERGEYX_ БД в Delphi 3 10.10.2010 11:38
Скорость работы программы Farrel Общие вопросы C/C++ 0 10.09.2010 23:25