Конференция "Начинающим" » Проблема со скоростью [D7, MS Access]
 
  • Бисовецкий Андрей (07.08.09 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 © (07.08.09 14:03) [1]
    Попробовать переделать на запрос с параметрами. Хотя для аксеса это возможно и не столь актуально.
  • Sergey13 © (07.08.09 14:05) [2]
    А бейсиковская программа оперирует с тем же файлом БД? Если БД разные то все ли индексы одинаковые?
  • Бисовецкий Андрей (07.08.09 14:08) [3]
    файл один и тот же, мне кажется что запрос с параметрами ничего не изменит
  • Бисовецкий Андрей (07.08.09 14:08) [4]
    и база та же
  • Виталий Панасенко (07.08.09 14:54) [5]
    Попробуй вместо кверика ADOCommand. Ты ж только вставляешь данные. И прочитай файл одним махом в TStringList например, на больших объемах заметно прибавление скорости
  • MsGuns © (07.08.09 14:56) [6]
    ODBC вроде шустрее (акцес вроде через него работает)
  • sniknik © (07.08.09 15:46) [7]
    > а если кому надо то могу переслать и файл с запросами
    перешли, вечером попробую сколько получится.

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

    > акцес вроде через него работает
    вранье. он не может, т.к. сам ODBC работает через jet.
  • Anatoly Podgoretsky © (07.08.09 16:08) [8]
    > sniknik  (07.08.2009 15:46:07)  [7]

    И вроде бы сам Акцесс работает через свои средства, JET это для внешнего мира. Не буду настаивать, если это не так.
  • sniknik © (07.08.09 16:56) [9]
    > И вроде бы сам Акцесс работает через свои средства, JET это для внешнего мира. Не буду настаивать, если это не так.
    легко проверяется, заходишь в access (программу), набиваешь запрос к несуществующей таблице, выполняешь и смотришь от кого ошибка...
  • девушка (09.08.09 09:21) [10]
    из личных наблюдений в access лучше всего вставлять через буфер обмена. Т.е. в екселе формируем нужную табличку, выбираем столбцы, говорим ctrl+insert заходим в access, входим в табличку, выбираем столбцы и говорим shift+insert. И никакого делфи не нада. )))
  • Бисовецкий Андрей (09.08.09 16:03) [11]
    никаких коментариев ДЕВУШКА
  • Бисовецкий Андрей (09.08.09 16:12) [12]
    перепробовал и стринглист и коммандтекст - время уменьшилось примерно в 2 раза, но этого для моих потребностей недостаточно! Хотел бы проинструктироваться по поводу
    > а вообще оптимально было бы привести файл к CSV формату,
    >  тогда бы это вставлялось одной командой, около секунды.
    > .. (скорее в меньшую сторону чем в большую)

    если можно то подробно, а то я такое только левым ухом слышал.
    Заранее спасибо всем участвующим.
  • sniknik © (09.08.09 17:13) [13]
    подробно в справке jet (можно из access).
    а смысл в том, что ядро jet имеет внешние исамы для разных баз, форматированный текстовый файл это тоже своего рода таблица такой базы (ограниченная, но все таки). обращение к исаму возможно прямо в запросе, поэтому все, что нужно, это один простой запрос на вставку, вида INSERT INTO price SELECT .... FROM Table IN ISAM.
    ну там еще есть тонкости как (из какого формата) читать и как настаивать (инициализировать), но это страниц на пять текста в хелпе.
  • sniknik © (09.08.09 17:36) [14]
    вот, проверил, запрос вкачивающий данные таким образом отработал за 28.5 сек на не очень мощной машине (AMD Atlon(tm) 3200+), или уже говорить на совсем не мощной? :)

    текстовый файл с данными "весит" 155 мег, записей в нем 1 374 656, полей не 8 как у тебя а 14. (что было, то и проверил)
    т.е. твои 3800 считай вообще ничто.
  • sniknik © (09.08.09 17:38) [15]
    > т.е. твои 3800 считай вообще ничто.
    если в пропорции то твое должно "вкачать" за 0,08сек.
  • Бисовецкий Андрей (10.08.09 10:22) [16]
    оч. благодарен Вам за внимание.
    Могли бы Вы привести отрезок файла, и запрос к нему на вставку, а то в хелпе только о инициализации драйвера ядра базы данных. Я то  еще поищу, но если не составит труда то помогите. Спасибо.
  • Anatoly Podgoretsky © (10.08.09 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 © (10.08.09 11:23) [18]
    Описка, конечно не AdoDataset, а AdoCommand
    Использование ADOQuery вообще не удачная идея, а в данном коде особо неудачная.
  • девушка (11.08.09 17:36) [19]

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

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

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

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

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

    много умнее идея и полезней
  • Бисовецкий Андрей (12.08.09 16:12) [21]
    Переходим на тему ISAM и как с ним работать. Я с этим встречаюсь впервые и нуждаюсь в подробных инструкциях. Какая строка подключения, скл запрос, структура файла, конфиг файлы(если такие имеются) и т.д.
  • sniknik © (12.08.09 16:51) [22]
    > Какая строка подключения, скл запрос, структура файла, конфиг файлы(если такие имеются) и т.д.
    sniknik ©   (09.08.09 17:13) [13]
    > подробно в справке jet (можно из access).

    переписывать её сюда вряд ли кто будет...
  • Бисовецкий Андрей (13.08.09 16:57) [23]
    ну хоть запрос на вставку из отдельного файла в классическую базу данных можно написать, а?
  • sniknik © (13.08.09 20:38) [24]
    в [13] чем не устраивает? имя исама там же, в хелпе. или смущает многоточие? там должны перечисляться копируемые поля.
  • Бисовецкий Андрей (14.08.09 14:56) [25]
    меня как раз многоточия и не смущают, меня смущает ХЕЛП. Я ничего на мой взгляд стоящего не могу найти. Если можно дайте ссылочку на хелп, или дайте полный запрос на выборку из текстового файла C:\Table.txt с полями для выборки *
    Заранее спасибо, мучаюсь, а вы только хелп да хелп, мне нужна конкретная помощь. Знаю я что если самому раз найти то всю жизнь помнить буду..... но мне нужна скорость, и так уже неделю мучаюсь.
  • sniknik © (14.08.09 16:21) [26]
    > меня смущает ХЕЛП
    что тебя в нем смущает? обнаженная кнопка F1?

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

    > мне нужна конкретная помощь.
    на конкретную ты потерял право как только сам перестал говорить по делу... и перестал обдумывать ответы.
  • Бисовецкий Андрей (14.08.09 17:54) [27]
    Удалено модератором
    Примечание: Но пойдешь ты
  • Jeer © (14.08.09 18:00) [28]

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


    Ты этого ждал ?
    Этого не будет - это твоя задача.
  • sniknik © (14.08.09 19:20) [29]
    > Очень уж трудно дать Конкретную команду. Искренне ваш ламер
    нет конечно, не трудно,
    так же как тебе было нетрудно послать файл с запросами, которые сам предлагал, и тогда когда он был еще интересен.
    так же нетрудно как тебе было узнать про формат CSV, про который тебе сказали, а ты проигнорировал, начал просить пример такого файла, вместо того чтобы почитать о нем. и спрашивать конкретно.
    так же нетрудно как тебе рассказать как можно умудрится в справке чего то по ключевым словам не найти... это ж как искать надо? (и это кстати очень всех в таких вопросах интересует... никого не устраивает фраза "искал везде и не нашел")

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

    здесь не служба поддержки где кто то тебе обязан, а ты только "потребляешь" и заказываешь "дайте мне то, нет дайте мне это, а то унесите", здесь равноправие - ты игнорируешь, тебя игнорируют... т.е. нормальное общение. считаешь несправедливым? иди туда же...
 
Конференция "Начинающим" » Проблема со скоростью [D7, MS Access]
Есть новые Нет новых   [134477   +38][b:0][p:0.002]