Мы пытаемся выполнить пакетную вставку в Azure Synapse (ранее Azure SQL Хранилище данных). Проблемы:
- Производительность ужасная (~ 1 секунда для вставки одной строки размером менее 2 КБ и 20-25 столбцов)
- Масштабируется линейно (~ 90 секунд для 100 строк Я думаю)
Мы используем стандартный JDB C шаблон пакетной вставки addBatch()
и executeBatch()
с PreparedStatements
({ ссылка }).
Мы используем драйвер JDB C, предоставленный Microsoft.
Мы знаем, что не так, в телеметрии БД ясно, что БД разбивает пакет и более или менее запускает его, как если бы он для-л oop. Никакой пакетной «оптимизации».
Любопытно, что когда базовым источником данных является SQL Сервер, пакет масштабируется должным образом.
Вопрос: В стандарте ничего нет / spe c, в котором говорится, что executeBatch()
должно масштабироваться лучше, чем линейно?
Например, JDBC™ 4.3 Specification (JSR 221)
говорит, что может улучшить производительность, а не обязательно .
ГЛАВА 14 Пакетные обновления
Средство пакетного обновления позволяет отправлять несколько операторов SQL в источник данных для обработки сразу. Отправка нескольких операторов SQL вместо отдельных может значительно повысить производительность. Объекты Statement, PreparedStatement и CallableStatement могут использоваться для отправки пакетных обновлений.
14.1.4 PreparedStatement Objects
не имеет такого явного / подразумеваемого оператора, чтобы сказать, что пакетный механизм предназначен для повышения производительности.
Следует, вероятно, добавить, что Azure Synapse способен загружать 1 триллион строк данных (~ 450 ГБ в формате Parquet) из озера данных за 17-26 минут с 500 DWU.