Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в таблицу MS SQL? Скажем, 100-300 тыс строк
Данные именно из Делфи, в другом месте их нет

построчные инсерты будут тормозить или не очень?
27 май 17, 09:04    [20516692]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
JaDi
Member

Откуда: JayDi из Сызрани
Сообщений: 3021
Пока ждать ответа с форума -- данные уже давно залились бы :-)
27 май 17, 09:26    [20516701]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Sevolod
Member

Откуда:
Сообщений: 104
andreymx, может в текстовый файл, а потом bulk insert?
27 май 17, 10:25    [20516754]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
JaDi
Пока ждать ответа с форума -- данные уже давно залились бы :-)
мне не на один раз
27 май 17, 12:15    [20516849]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
azsx
Member

Откуда:
Сообщений: 488
http://www.sql.ru/forum/393155/optimizaciya-insert
зы
А о чем речь? Какие данные вставляются, какие индексы, какая скорость вставки, БД на хдд или ссд?
27 май 17, 13:49    [20516963]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57304
andreymx> как наиболее быстро залить данные из Delphi 7
andreymx> (датасет, массив) в таблицу MS SQL? Скажем, 100-300 тыс строк


Пачками. Т.е. либо ArrayDML, либо всякие
вариации BULK-инсерт на стороне сервера.
Компоненты доступа какие используются?

P.S. Хотя ради 300 тыс строк смысла особо
париться нет, если это не очень частая и
критичная по времени операция, конечно.

Posted via ActualForum NNTP Server 1.5

27 май 17, 15:01    [20517031]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57304
azsx> azsx

Вы бы читали и думали, прежде чем отвечать и ссылки давать.
При чём тут MySQL, если ТСу нужен MSSQL, какая ему дело
до типа носителя данных на сервере (он может его не знать и
это может меняться в ходе эксплуатации) и т.д.

Posted via ActualForum NNTP Server 1.5

27 май 17, 15:04    [20517033]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
Гаджимурадов Рустам

Пачками. Т.е. либо ArrayDML, либо всякие
вариации BULK-инсерт на стороне сервера.
Компоненты доступа какие используются?


ado или что-то другое бесплатное
27 май 17, 19:49    [20517319]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57304
andreymx> ado

Ну, он ArrayDML сам не умеет, поэтому пачками собирать
запросы до макс.размера стейтмента и пулять на сервер.

andreymx> или что-то другое бесплатное

Ну FireDAC умеет. Умел ли AnyDAC - не помню.

Posted via ActualForum NNTP Server 1.5

27 май 17, 20:20    [20517345]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
Целевая бд очень нагружена, просят нагружать по минимуму
27 май 17, 20:40    [20517356]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
bk0010
Member

Откуда:
Сообщений: 3401
У MS SQL была утилитка, которая очень резво грузила данные из текстовых файлов (SSIS вроде, давно это было, уже не помню). Соответственно, можно выгрузить данные в текстовый файл, сжать его, отправить на сервер (ftp, smb, http), а на сервере поставить программку, которая примет файл, разархивирует, натравит на него SSIS, вернет результат и приберется за собой. В этом случае придется программировать много (особенно по сравнению с простой загрузкой на сервер), но база будет нагружена минимально.
Второй похожий вариант - сформировать sql с insert-ами, загнать его на сервер и выполнить (тут опасайтесь long transaction, не знаю как эта хрень в MS SQL называется, когда транзакция, выполняемая слишком долго, считается зависшей и откатывается).
27 май 17, 21:12    [20517378]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
JaDi
Member

Откуда: JayDi из Сызрани
Сообщений: 3021
andreymx
Целевая бд очень нагружена, просят нагружать по минимуму

Загружать по расписанию в ночное время. Загружать порциями. Загружать во временные таблицы. Выделить под загрузку отдельную роль с ограниченными ресурсами и грузить через нее, чтобы другие не тормозили.
27 май 17, 22:29    [20517470]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57304
andreymx> Целевая бд очень нагружена, просят нагружать по минимуму

У тебя это частая нерегулируемая операция или планируемая?
Если второе - то логично вынести её на низконагруженное время,
и соответственно вариации bulk-inserta. Если первое, то пачками.

Posted via ActualForum NNTP Server 1.5

28 май 17, 00:38    [20517618]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
чччД
Guest
Разве insert - это тяжелая для сервера операция? Да еще если "параметризованный", и нет тяжелых индексов и триггеров на вставку.
Я думал, проблема в нагрузке на сеть, и нужно побыстрее. А оно вон что. Если сервер нежелательно отвлекать на долгую загрузку, следует инсерты наоборот растянуть во времени, выполнять редко, исходя из требований.
Другое дело - как скоро нужны будут результаты загрузки.
28 май 17, 01:53    [20517641]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
работает, уже плюс
очень медленно, минус
16.5 тыс строк заливает минуты 3 и больше
+
//примерчик
  countLoad := 0;
  iStep := 32;

  ADOQuery.SQL.Text := cStr;
  ADOQuery.Prepared := true;
  ADOQuery.ParamCheck := false;

  Screen.Cursor := crSQLWait;
  ExportDS.First;

  if CheckCOMMITMSSQL.Checked then
  begin
    ADOConn.BeginTrans;
  end;

  while (not ExportDS.Eof) do
  begin
      for i := 0 to countFields-1 do
      begin
        ADOQuery.Parameters[i].Value := arrFields[i].Value;
      end;
      ADOQuery.ExecSQL;
      inc(countLoad);
      if  countLoad mod SpinEditCOMMITMSSQL.Value = 0)
      then begin
        ADOConn.CommitTrans;
        ADOConn.BeginTrans;
      end;

    ExportDS.Next;
  end; // конец цикла обработки данных

  ADOConn.CommitTrans;
в ADOQuery - обычный рядовой инсерт с параметрами
arrFields - массив выбранных TField


В Оракл через ArrayDML заливает за секунду
Инфоpмация
----------
Данные записаны в БД , таблица "TMP_1"
Количество записанных строк: 16845
Время закачки: 0,807 с.
19 сен 17, 17:54    [20806916]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
это само собой
  ExportDS.DisableControls;
  ExportDS.AfterScroll := Nil;
19 сен 17, 18:00    [20806931]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22967
andreymx
 ExportDS.First;

С гридом случайно не связан? Курсор не бегает при этом по нему?
19 сен 17, 18:00    [20806934]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 5573
andreymx,

Гм, не совсем помню, как там в MSSQL, но кажется стартовать/коммитить транзакцию на каждый чих - излишество.
19 сен 17, 18:00    [20806935]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
DarkMaster
andreymx,

Гм, не совсем помню, как там в MSSQL, но кажется стартовать/коммитить транзакцию на каждый чих - излишество.
там не на каждый чих, а на порцию
19 сен 17, 18:01    [20806938]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 5573
andreymx,

А нет, сорри, поторопился, не усмотрел счетчик "записей в пачке"...
19 сен 17, 18:02    [20806941]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
если отключить ADOQuery.ExecSQL;, то Время закачки: 0,707 с.
19 сен 17, 18:02    [20806943]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22967
andreymx
это само собой
  ExportDS.DisableControls;
  ExportDS.AfterScroll := Nil;

Поиграйся с настройками курсора и направления.
19 сен 17, 18:03    [20806947]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22967
wadman
andreymx
это само собой
  ExportDS.DisableControls;
  ExportDS.AfterScroll := Nil;


Поиграйся с настройками курсора и направления.

Тот же ltBatchOptimistic
19 сен 17, 18:04    [20806952]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
wadman,

там обычный инсерт
думаешь, может помочь?
+
INSERT INTO DBO.TMP_ (
checked,
bs_type,
bs_category,
name_old,
OWNEDBYORGANIZATION,
id_old,
SERVICEID,
DISPLAYNAME_old,
DISPLAYNAME,
lord,
lord_fio,
Service_TechicalManager,
priority,
status,
AVAILABILITYSCHEDULE,
notes,
grp2,
grp2l,
grp3,
grp3l,
tech_manager
)
VALUES
(
:checked,
:bs_type,
:bs_category,
:name_old,
:OWNEDBYORGANIZATION,
:id_old,
:SERVICEID,
:DISPLAYNAME_old,
:DISPLAYNAME,
:lord,
:lord_fio,
:Service_TechicalManager,
:priority,
:status,
:AVAILABILITYSCHEDULE,
:notes,
:grp2,
:grp2l,
:grp3,
:grp3l,
:tech_manager
)
19 сен 17, 18:06    [20806959]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42534
Инфоpмация
----------
Данные записаны в БД, таблица DBO.TMP_sap
Количество записанных строк: 16845
Время закачки: 212,748 с.
Скорость закачки: 79 строк/сек, 1663 полей/сек
Дата: 19.09.2017 18:11:59

  object ADOQuery: TADOQuery
    AutoCalcFields = False
    CacheSize = 500
    Connection = ADOConn
    LockType = ltBatchOptimistic
    CommandTimeout = 300
  end
19 сен 17, 18:13    [20806971]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить