При работе с базами данных часто возникает необходимость массовой вставки данных. В случае использования 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 с несколькими парами значений может выглядеть так:
где ... обозначает продолжение списка параметров для каждой новой записи.
Выводы
Использование свойства ArraySize в FireDAC для массовой вставки данных в PostgreSQL из Delphi XE10.1 требует понимания его ограничений и возможностей. Пакетная обработка запросов является эффективным решением для ускорения процесса вставки больших объемов данных. При этом важно правильно настроить размер пакета и корректно обработать остаток данных, если он есть после основного цикла обработки.
Пользователь сталкивается с необходимостью ускорить массовую вставку данных в таблицу PostgreSQL через Delphi XE10.1 с использованием FireDAC, настраивая свойство `ArraySize`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.