Плохая производительность вставки [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Плохая производительность вставки [закрыто]

Сообщение Anonymous »

Мне нужно вставить примерно 180 000 строк с помощью программы Java. Это должно быть сделано за одну транзакцию.
Я делаю пакетную вставку следующим образом:

Код: Выделить всё

public List insertBatch(final List
 pageEnterLeaveObjects) {
final String stmt = "insert into mwfs2_page_enter_leave (session_id, form_id, version, tenant, page, enter_ts, leave_ts)" +
" values (:sessionId, :formId, :version, :tenant, :page, :enter, :leave)";
final List result = new LinkedList();
ListUtils.partition(pageEnterLeaveObjects, 10000)
.forEach(partition -> {
final SqlParameterSource[] sqlParameterSources = partition.stream()
.map(pageEnterLeave ->
new MapSqlParameterSource()
.addValue("sessionId", pageEnterLeave.getSessionId())
.addValue("formId", pageEnterLeave.getFormId())
.addValue("version", pageEnterLeave.getVersion())
.addValue("tenant", Optional.ofNullable(pageEnterLeave.getTenant()).orElse(Constants.DEFAULT_TENANT))
.addValue("page", pageEnterLeave.getPage())
.addValue("enter", pageEnterLeave.getEnterTimestamp())
.addValue("leave", pageEnterLeave.getLeaveTimestamp()))
.toArray(SqlParameterSource[]::new);
final long exectime = StopWatch.run(() -> {
final int[] ints = namedParameterJdbcTemplate.batchUpdate(stmt, sqlParameterSources);
result.addAll(Arrays.stream(ints).boxed().toList());
});
LOGGER.debug("insert {} datasets in {}ms", partition.size(), exectime);
});
return result;
}
Программа поддерживает другие базы данных (PostgreSQL, Oracle и т. д.), и все базы данных, которые я тестировал на данный момент, завершают вставку примерно за одну минуту. Однако SQL Server выполняет ту же задачу примерно за 30 минут.
Вот таблица:

Код: Выделить всё

create table dbo.mwfs2_page_enter_leave
(
session_id varchar(100) not null,
form_id    varchar(100) not null,
version    varchar(100) not null,
tenant     varchar(100) not null,
page       int          not null,
enter_ts   bigint       not null,
leave_ts   bigint,
diff       bigint,
primary key (session_id, form_id, version, tenant, page, enter_ts)
)
SQL Server работает в контейнере Docker Compose, но мы наблюдали плохую производительность и в облаке Azure.
Вот моя конфигурация Docker Compose:

Код: Выделить всё

  mssql-2022:
image: 'mcr.microsoft.com/mssql/server:2022-latest'
restart: 'no'
environment:
ACCEPT_EULA: 'Y'
MSSQL_SA_PASSWORD: '******'
ports:
- '127.0.0.1:1433:1433'
Я чувствую себя немного застрявшим и понятия не имею, почему это происходит. Будем очень признательны за любые подсказки.

Подробнее здесь: https://stackoverflow.com/questions/791 ... erformance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»