JDB C гарантии пакетного выполнения - PullRequest
0 голосов
/ 05 мая 2020

Мы пытаемся выполнить пакетную вставку в 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.

1 Ответ

1 голос
/ 05 мая 2020

Спецификация JDB C не требует какой-либо оптимизации для пакетного выполнения. Фактически, не все базы данных поддерживают пакетное выполнение. Ожидается, что соответствующий драйвер JDB C будет реализовывать пакетное выполнение независимо от того, поддерживает ли его базовая система базы данных.

Если система базы данных не поддерживает его, драйвер JDB C будет имитировать пакетное выполнение, повторное выполнение оператора в al oop. Такая реализация не будет работать лучше, чем повторное выполнение оператора вручную.

Именно поэтому в цитируемом вами тексте говорится: « может значительно улучшить производительность» , а не будет или обязательно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...