Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.18;
Скачать: CL | DM;

Вниз

Проблема со скоростью   Найти похожие ветки 

 
Бисовецкий Андрей   (2009-08-07 13:58) [0]

Привет всем, появилась серьезная проблема со скоростью выполнения запроса скл к базе данных MS ACCESS. Есть файл с запросами типа INSERT. Я читаю каждый запрос с новой строчки и сходу выполняю, т.к. только так и умею. 3800 запросов выполняются примерно секунд 47. Аналогичная конструкция только написана на Бэйсике делает  эти операции за 25 сек. Но мне нужно именно на Делфи. Ниже выставляю код программы, а если кому надо то могу переслать и файл с запросами

Прога:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DB, ADODB;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 f: TextFile;
 tmp: String;
 ADOQuery1: TADOQuery;
 t: TDateTime;
begin
ADOQuery1 := TADOQuery.Create(self);
AssignFile(f, "1");
ReSet(f);
ADOQuery1.ConnectionString := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Other\Проэкты\tmp\Andrey\db.mdb;Persist Security Info=False";
t := Now();

 while not EOF(f) do
 begin
   ReadLn(f, tmp);
   Delete(tmp, 1, 1);
   Delete(tmp, Length(tmp) - 3, 4);
   ADOQuery1.SQL.Add(tmp);
   ADOQuery1.ExecSQL;
   ADOQuery1.SQL.Clear;
 end;

CloseFile(f);
ADOQuery1.ExecSQL;
ShowMessage(FormatDateTime("hh.mm.ss", Now() - t));
ADOQuery1.Active := False;
ADOQuery1.Free;
end;

end.


И вот примерное содержимое файла:

"INSERT INTO price(preparat, cena, proisv, upak, srok, kod_tov, tam_cena, data_pr, post) VALUES("5-НОК; ТАБЛ П/О 50МГ N50", "19,91","SANDOZ","1","1,13","21","22,30","07.08.2009","Фарм-Сервіс");;;"
"INSERT INTO price(preparat, cena, proisv, upak, srok, kod_tov, tam_cena, data_pr, post) VALUES("5-ФТОРУРАЦИЛ; Р-Р Д/ИН 500МГ 10МЛ №1", "63","EBEWE","1","7,10","14193","0,00","07.08.2009","Фарм-Сервіс");;;"
"INSERT INTO price(preparat, cena, proisv, upak, srok, kod_tov, tam_cena, data_pr, post) VALUES("5-ФТОРУРАЦИЛ; Р-Р Д/ИН 500МГ 10МЛ №5", "348,67","EBEWE","1","10,10","13666","350,41","07.08.2009","Фарм-Сервіс");;;"
"INSERT INTO price(preparat, cena, proisv, upak, srok, kod_tov, tam_cena, data_pr, post) VALUES("L-ЛИЗИНА ЭСЦИНАТ; Р-Р Д/ИН 0,1% 5МЛ №10", "75,85","КМП АРТЕРИУМ","20","4,11","3742","85,00","07.08.2009","Фарм-Сервіс");;;"

Каждый запрос с новой строчки.

Жду помощи старейшин. Оч. уж долго сам мучался.
D2009 (желательно), Д7-тоже есть


 
Sergey13 ©   (2009-08-07 14:03) [1]

Попробовать переделать на запрос с параметрами. Хотя для аксеса это возможно и не столь актуально.


 
Sergey13 ©   (2009-08-07 14:05) [2]

А бейсиковская программа оперирует с тем же файлом БД? Если БД разные то все ли индексы одинаковые?


 
Бисовецкий Андрей   (2009-08-07 14:08) [3]

файл один и тот же, мне кажется что запрос с параметрами ничего не изменит


 
Бисовецкий Андрей   (2009-08-07 14:08) [4]

и база та же


 
Виталий Панасенко   (2009-08-07 14:54) [5]

Попробуй вместо кверика ADOCommand. Ты ж только вставляешь данные. И прочитай файл одним махом в TStringList например, на больших объемах заметно прибавление скорости


 
MsGuns ©   (2009-08-07 14:56) [6]

ODBC вроде шустрее (акцес вроде через него работает)


 
sniknik ©   (2009-08-07 15:46) [7]

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

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

> акцес вроде через него работает
вранье. он не может, т.к. сам ODBC работает через jet.


 
Anatoly Podgoretsky ©   (2009-08-07 16:08) [8]

> sniknik  (07.08.2009 15:46:07)  [7]

И вроде бы сам Акцесс работает через свои средства, JET это для внешнего мира. Не буду настаивать, если это не так.


 
sniknik ©   (2009-08-07 16:56) [9]

> И вроде бы сам Акцесс работает через свои средства, JET это для внешнего мира. Не буду настаивать, если это не так.
легко проверяется, заходишь в access (программу), набиваешь запрос к несуществующей таблице, выполняешь и смотришь от кого ошибка...


 
девушка   (2009-08-09 09:21) [10]

из личных наблюдений в access лучше всего вставлять через буфер обмена. Т.е. в екселе формируем нужную табличку, выбираем столбцы, говорим ctrl+insert заходим в access, входим в табличку, выбираем столбцы и говорим shift+insert. И никакого делфи не нада. )))


 
Бисовецкий Андрей   (2009-08-09 16:03) [11]

никаких коментариев ДЕВУШКА


 
Бисовецкий Андрей   (2009-08-09 16:12) [12]

перепробовал и стринглист и коммандтекст - время уменьшилось примерно в 2 раза, но этого для моих потребностей недостаточно! Хотел бы проинструктироваться по поводу
> а вообще оптимально было бы привести файл к CSV формату,
>  тогда бы это вставлялось одной командой, около секунды.
> .. (скорее в меньшую сторону чем в большую)

если можно то подробно, а то я такое только левым ухом слышал.
Заранее спасибо всем участвующим.


 
sniknik ©   (2009-08-09 17:13) [13]

подробно в справке jet (можно из access).
а смысл в том, что ядро jet имеет внешние исамы для разных баз, форматированный текстовый файл это тоже своего рода таблица такой базы (ограниченная, но все таки). обращение к исаму возможно прямо в запросе, поэтому все, что нужно, это один простой запрос на вставку, вида INSERT INTO price SELECT .... FROM Table IN ISAM.
ну там еще есть тонкости как (из какого формата) читать и как настаивать (инициализировать), но это страниц на пять текста в хелпе.


 
sniknik ©   (2009-08-09 17:36) [14]

вот, проверил, запрос вкачивающий данные таким образом отработал за 28.5 сек на не очень мощной машине (AMD Atlon(tm) 3200+), или уже говорить на совсем не мощной? :)

текстовый файл с данными "весит" 155 мег, записей в нем 1 374 656, полей не 8 как у тебя а 14. (что было, то и проверил)
т.е. твои 3800 считай вообще ничто.


 
sniknik ©   (2009-08-09 17:38) [15]

> т.е. твои 3800 считай вообще ничто.
если в пропорции то твое должно "вкачать" за 0,08сек.


 
Бисовецкий Андрей   (2009-08-10 10:22) [16]

оч. благодарен Вам за внимание.
Могли бы Вы привести отрезок файла, и запрос к нему на вставку, а то в хелпе только о инициализации драйвера ядра базы данных. Я то  еще поищу, но если не составит труда то помогите. Спасибо.


 
Anatoly Podgoretsky ©   (2009-08-10 11:16) [17]

ADOQuery1.ConnectionString := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Other\Проэкты\tmp\Andrey\db.mdb;Persist Security Info=False";
t := Now();

while not EOF(f) do
begin
  ReadLn(f, tmp);
  Delete(tmp, 1, 1);
  Delete(tmp, Length(tmp) - 3, 4);
  ADOQuery1.SQL.Add(tmp);
  ADOQuery1.ExecSQL;
  ADOQuery1.SQL.Clear;
end;

Это желательно изменить

1. Добавить TAdoConnection
2. ADOQuery1 заменить на ADODataset - сразу ряд проблем уменьшится.

И зачем в конце еще один ADOQuery1.ExecSQL;


> CloseFile(f);
> ADOQuery1.ExecSQL;


 
Anatoly Podgoretsky ©   (2009-08-10 11:23) [18]

Описка, конечно не AdoDataset, а AdoCommand
Использование ADOQuery вообще не удачная идея, а в данном коде особо неудачная.


 
девушка   (2009-08-11 17:36) [19]


> Бисовецкий Андрей   (09.08.09 16:03) [11]
> никаких коментариев ДЕВУШКА

Советую попробовать... через буфер обмена за 40 секунд можно 65500 записей екселя (читай CSV) в access вставить... Причем, несколько раз. Хотя, если такую операцию приходится повторять регулярно - не вариант. Если только через OLE не изгольнуться.


 
Виталий Панасенко(дом)   (2009-08-11 17:49) [20]


> девушка   (11.08.09 17:36) [19]

зачем советовать глупости?

> sniknik ©   (07.08.09 15:46) [7]

много умнее идея и полезней


 
Бисовецкий Андрей   (2009-08-12 16:12) [21]

Переходим на тему ISAM и как с ним работать. Я с этим встречаюсь впервые и нуждаюсь в подробных инструкциях. Какая строка подключения, скл запрос, структура файла, конфиг файлы(если такие имеются) и т.д.


 
sniknik ©   (2009-08-12 16:51) [22]

> Какая строка подключения, скл запрос, структура файла, конфиг файлы(если такие имеются) и т.д.
sniknik ©   (09.08.09 17:13) [13]
> подробно в справке jet (можно из access).

переписывать её сюда вряд ли кто будет...


 
Бисовецкий Андрей   (2009-08-13 16:57) [23]

ну хоть запрос на вставку из отдельного файла в классическую базу данных можно написать, а?


 
sniknik ©   (2009-08-13 20:38) [24]

в [13] чем не устраивает? имя исама там же, в хелпе. или смущает многоточие? там должны перечисляться копируемые поля.


 
Бисовецкий Андрей   (2009-08-14 14:56) [25]

меня как раз многоточия и не смущают, меня смущает ХЕЛП. Я ничего на мой взгляд стоящего не могу найти. Если можно дайте ссылочку на хелп, или дайте полный запрос на выборку из текстового файла C:\Table.txt с полями для выборки *
Заранее спасибо, мучаюсь, а вы только хелп да хелп, мне нужна конкретная помощь. Знаю я что если самому раз найти то всю жизнь помнить буду..... но мне нужна скорость, и так уже неделю мучаюсь.


 
sniknik ©   (2009-08-14 16:21) [26]

> меня смущает ХЕЛП
что тебя в нем смущает? обнаженная кнопка F1?

> Я ничего на мой взгляд стоящего не могу найти.
ну так учись искать... не можешь, читай все подряд. не так уж там много, на SELECT или INSERT (? с чем у тебя проблемы, не можешь составить) выдает, на страницу ссылок на разделы всего, за неделю (часа бы хватило) прочитал бы все, и там точно есть как в них используются интересующие исамы, и примеры в тех же ссылках есть, правда на бейсике.

> мне нужна конкретная помощь.
на конкретную ты потерял право как только сам перестал говорить по делу... и перестал обдумывать ответы.


 
Бисовецкий Андрей   (2009-08-14 17:54) [27]

Удалено модератором
Примечание: Но пойдешь ты


 
Jeer ©   (2009-08-14 18:00) [28]


> Очень уж трудно дать Конкретную команду


Ты этого ждал ?
Этого не будет - это твоя задача.


 
sniknik ©   (2009-08-14 19:20) [29]

> Очень уж трудно дать Конкретную команду. Искренне ваш ламер
нет конечно, не трудно,
так же как тебе было нетрудно послать файл с запросами, которые сам предлагал, и тогда когда он был еще интересен.
так же нетрудно как тебе было узнать про формат CSV, про который тебе сказали, а ты проигнорировал, начал просить пример такого файла, вместо того чтобы почитать о нем. и спрашивать конкретно.
так же нетрудно как тебе рассказать как можно умудрится в справке чего то по ключевым словам не найти... это ж как искать надо? (и это кстати очень всех в таких вопросах интересует... никого не устраивает фраза "искал везде и не нашел")

ты просто игнорировал тех у кого спрашивал, их ответы... и теперь удивляешься что игнорируют тебя? и не дают то что ты хочешь, а дают то, что считают нужным (в твоем же "ключе").

здесь не служба поддержки где кто то тебе обязан, а ты только "потребляешь" и заказываешь "дайте мне то, нет дайте мне это, а то унесите", здесь равноправие - ты игнорируешь, тебя игнорируют... т.е. нормальное общение. считаешь несправедливым? иди туда же...



Страницы: 1 вся ветка

Текущий архив: 2009.10.18;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.01 c
15-1250678829
DSKalugin
2009-08-19 14:47
2009.10.18
Переведите пожалуйста с паскаля на php


1-1219825246
tytus
2008-08-27 12:20
2009.10.18
TFrxMemoView - OnBeforePrint - поставить знак "минус"


15-1250235878
Taur
2009-08-14 11:44
2009.10.18
Delphi 2005 Не корректно отображается код


3-1228252748
istok2
2008-12-03 00:19
2009.10.18
проблема с TIBScript


11-1200751243
Vladimir Kladov
2008-01-19 17:00
2009.10.18
Версия 2.86