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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2021, 14:58   #11
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Почему балк вставку не делаете сразу? Зачем по 1 записи вставлять? Нужно понимать что в целом вставка во первых запускает кучу процессов в самой СУБД и во вторых вы увеличивает расход времени на ожидание ответа от СУБД после вставки. Балк вставка открывает одну транзакцию, вставляет все, закрывает ее и передает вам результат - ОДИН РАЗ. А не открывает как в Вашем примере кода 100500 транзакций и не отчитывается перед вами за каждую после Exec. Плюсом еще после каждой завершенной транзакции MySQL еще и индексы Вам пересчитывает. Отсюда- низкая скорость и в хлам загруженый HDD.

Не могу конкретно сказать про mySQL но на MSSQL можно передать XML как параметр хранимки и вставить его весь и сразу. Эти 99 тыс записей в таблицу за пару секунд залетят. А если таблица почти не индексирована, то еще быстрее. Посмотрите, может ли MySQL сразу csv парсить, возможно и не надо всяких извращений с преобразованием, передайте его как параметр хранимки MySQL и радуйтесь скорости.
В качестве примера могу выложить кусок рабочего кода, где парсингом занимается MS SQL, только не CSV, а XML :

... MS SQL
Код:
@DataXML text
AS
BEGIN
  DECLARE @HandleData int
  EXEC sp_xml_preparedocument @HandleData OUTPUT, @DataXML ;
INSERT INTO dbo.Reestrs(
   code,
   code_mo,
   amonth,
   ayear,
   nshet,
   dschet,
   plat,
   summav,
   coments,
   disp,
   sd_z)
 SELECT *
 FROM OPENXML (@HandleData ,'/ZL_LIST')  
 WITH
  (
    CODE varchar(40) 'SCHET/CODE',
    CODE_MO varchar(6) 'SCHET/CODE_MO',
    AMONTH int 'SCHET/MONTH',
    AYEAR int 'SCHET/YEAR',
    NSCHET nvarchar(15) 'SCHET/NSCHET',
    DSCHET date 'SCHET/DSCHET',
    PLAT varchar(20) 'SCHET/PLAT',
    SUMMAV money 'SCHET/SUMMAV',
    COMENTS varchar(250) 'SCHET/COMENTS',
    DISP varchar(3) 'SCHET/DISP',
    SD_Z int 'ZGLV/SD_Z'
  )   
END
DELPHI:
Код:
 var
  AListData: TFileStream;
begin
  try
    try
      AListData := TFileStream.Create(FReestr.FPathData,fmOpenRead);
      FInsertProced.Close;
      FInsertProced.StoredProcName := 'load_reestr.InsertReestr';
      FInsertProced.Prepare;
      FInsertProced.Params.ParamByName('@DataXML ').SetStream(AListData ,ftMemo);
      FInsertProced.ExecProc;
    except
      on E: Exception do
      BEGIN
        FReestr.FErrorText := E.Message;
        FReestr.FOwner.SetError(FReestr.FId,E.Message);
      END;
    end;
  finally
    FReestr.FLoading := True;
    FreeAndNil(AListData);
  end;
end;
Спокойно залетают и 300-500 метровые XML ки. Код делфи и MSSQl тупо выдраны из кода, но суть думаю ясна.
Например вставка 300-400 тысяч строк, занимает примерно 20 секунд. На саму вставку времени почти не тратиться,оно тратиться в основном на расстановку ключей и.т.д., т.к вставка идет в 10 разных таблиц потом это все связывается.
Но все равно этот подход занимет не более 2 часов на вставку и организацию 1-2 миллионов строк в БД, в каждой строке за 100 ячеек. Я думаю тут вопрос о скорости должен отпасть. В вашем случае и в ваших объемах, вставка у Вас вообще меньше секунды должна быть на 90 тыс записей, а то и выше. Просто изучите возможности MySQL, какой формат он умеет балком вставлять и передайте ему данные в этом формате. Как его передать я написал в блоке DELPHi, как вставить XML в блоке MS SQL. Mq и MS в плане SQL похожи.
Пишу много и развернуто

Последний раз редактировалось Heneken87; 30.01.2021 в 16:08.
Heneken87 вне форума Ответить с цитированием
Старый 01.02.2021, 11:03   #12
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Век живи - век учись. Спасибо. Я деж и не знал про такую возможность
iskurt вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[DELPHI + MySQL на хостинге] Возможен ли обмен сообщениями между компьютерами через MySQL на сайте? garuna БД в Delphi 5 21.08.2019 19:50
mySQL+DELPHI от и до shuhermayer SQL, базы данных 21 20.10.2011 21:22
Mysql+Delphi 2010 Использую libmysql.dll + mysql.pas не могу инф сохранить в базу kGpROGER БД в Delphi 7 30.12.2010 18:27
Delphi+MySQL prod87 БД в Delphi 2 18.08.2010 10:09