Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Понимание и настройка свойства ArraySize в FireDAC для ускорения массовой вставки данных в PostgreSQL из Delphi XE10.1

Delphi , Базы данных , SQL

При работе с базами данных часто возникает необходимость массовой вставки данных. В случае использования FireDAC (Delphi XE10.1) для взаимодействия с PostgreSQL, важно понимать, как работает свойство ArraySize и как его можно использовать для ускорения процесса вставки.

Проблема массовой вставки данных

Пользователь столкнулся с проблемой, когда при попытке вставить большое количество строк в таблицу TaskLog базы данных PostgreSQL, используя FireDAC, операция массовой вставки данных не выполнялась при значении ArraySize больше 1000. Это указывает на возможное ограничение свойства ArraySize при работе с PostgreSQL.

Структура таблицы TaskLog

Прежде чем перейти к решению проблемы, рассмотрим структуру таблицы TaskLog, для которой планируется массовая вставка данных:

CREATE TABLE TaskLog(
  id serial,
  taskid integer,
  x double precision,
  y double precision,
  loc character varying(50),
  speed smallint,
  gpstime timestamp without time zone,
  veh character varying(16),
  vin character(17),
  regdate date,
  enabled boolean,
  remake character varying(100),
  isdel boolean,
  alarm integer,
  CONSTRAINT pk_delphi_id PRIMARY KEY (id)
);

Пример кода для вставки данных

Код для вставки данных использует параметризованный запрос, который заполняется случайными данными. Пример функции RandomStr для генерации случайной строки и процедуры Button6Click для выполнения вставки:

function RandomStr(aLength: Integer): string;
begin
  // ...
end;

procedure TForm7.Button6Click(Sender: TObject);
begin
  // ...
  FDQuery1.SQL.Text := 'INSERT INTO TaskLog VALUES(default, :f1, :f2, :f3, :f4, :f5, :f6, ' +
    ':f7, :f8, :f9, :f10, :f11, :f12, :f13)';
  FDQuery1.Params.ArraySize := StrToInt(Edit1.text);
  // ...
  for i := 0 to FDQuery1.Params.ArraySize - 1 do
  begin
    // ...
  end;
  FDQuery1.Execute(FDQuery1.Params.ArraySize);
  // ...
end;

Подтвержденный ответ

Из предоставленного альтернативного ответа видно, что для ускорения массовой вставки данных в PostgreSQL можно использовать пакетную обработку. Это позволяет разбить все данные на блоки размером batch_part (например, 2000 записей) и выполнять вставку по частям.

const batch_part = 2000;
if Total > batch_part then begin
  j := Total div batch_part;
  for n := 1 to j do begin
    PostgreSQL.Query.Execute(n * batch_part, (n - 1) * batch_part);
  end;
  if (Total mod batch_part) > 0 then begin
    PostgreSQL.Query.Execute((Total mod batch_part) + (n - 1) * batch_part, (n - 1) * batch_part);
  end;
end
else begin
  PostgreSQL.Query.Execute(Total, 0);
end;

Альтернативный код для ускорения вставки

Попытка вставить все записи за один раз может привести к неэффективной работе и даже сбою, особенно для больших объемов данных. Использование пакетного запроса, где за один запрос можно вставить несколько строк, помогает избежать этого. Например, запрос SQL с несколькими парами значений может выглядеть так:

INSERT INTO TaskLog (id, taskid, x, y, loc, speed, gpstime, veh, vin, regdate, enabled, remake, isdel, alarm)
VALUES
(DEFAULT, :f1, :f2, :f3, :f4, :f5, :f6, :f7, :f8, :f9, :f10, :f11, :f12, :f13),
(DEFAULT, :f14, :f15, :f16, :f17, :f18, :f19, :f20, :f21, :f22, :f23, :f24, :f25, :f26), ...

где ... обозначает продолжение списка параметров для каждой новой записи.

Выводы

Использование свойства ArraySize в FireDAC для массовой вставки данных в PostgreSQL из Delphi XE10.1 требует понимания его ограничений и возможностей. Пакетная обработка запросов является эффективным решением для ускорения процесса вставки больших объемов данных. При этом важно правильно настроить размер пакета и корректно обработать остаток данных, если он есть после основного цикла обработки.

Создано по материалам из источника по ссылке.

Пользователь сталкивается с необходимостью ускорить массовую вставку данных в таблицу PostgreSQL через Delphi XE10.1 с использованием FireDAC, настраивая свойство `ArraySize`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 13:40:13/0.0035929679870605/0