Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
Бисовецкий Андрей   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.006 c
2-1250111284
Евгений Р.
2009-08-13 01:08
2009.10.18
Положение ToolButton


15-1250146126
Mar$ell
2009-08-13 10:48
2009.10.18
Microsoft SQL Server 2008 Express Edition with Tools


1-1220000095
Boris12
2008-08-29 12:54
2009.10.18
MSBuild + Delphi 2007 = дружат или нет?


15-1249378793
федот
2009-08-04 13:39
2009.10.18
абрвал


2-1250782279
istok20
2009-08-20 19:31
2009.10.18
createservice вызывает падение rpc...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский