Увеличение скорости массового импорта в базу данных MS SQL 2008 из клиентского приложения - PullRequest
2 голосов
/ 21 марта 2012

У меня есть приложение Qt, которое читает специальный текстовый файл, анализирует его и вставляет около 100000 строк во временную таблицу в базе данных Firebird. Затем он запускает хранимую процедуру для обработки этой временной таблицы и применения некоторых изменений к постоянным таблицам. В Firebird вставка 100000 строк во временную таблицу в памяти занимает около 8 секунд.

Теперь мне нужно реализовать такое поведение с использованием MS SQL Server 2008. Если я использую простые последовательные вставки, это займет около 76 секунд для 100000 строк. К сожалению, это слишком медленно. Я посмотрел на следующие пути:

  1. Временные таблицы (# и ##). Хранится на диске в схеме tempdb. Так что нет увеличения скорости.
  2. Массовая вставка. Очень хорошая скорость вставки, но нужна общая папка на стороне клиента или на сервере.
  3. Табличные переменные. MSDN говорит: «Не используйте табличные переменные для хранения больших объемов данных (более 100 строк)».

Итак, скажите, пожалуйста, как правильно увеличить скорость вставки из клиентского приложения в MSSSQL2008.

Спасибо.

1 Ответ

2 голосов
/ 21 марта 2012

Вы можете использовать операции массового копирования, доступные через OLE DB или ODBC интерфейсы.

Эта статья MSDN, кажется, держит вас за рукучерез процесс для ODBC:

  1. Выделите дескриптор среды и дескриптор соединения.

  2. Установите SQL_COPT_SS_BCP и SQL_BCP_ON для включения объемногооперации копирования.

  3. Подключение к SQL Server.

  4. Вызовите bcp_init для установки следующей информации:

    • Имя таблицы или представления для массового копирования из или в.

    • Укажите NULL для имени файла данных.

    • Имя файла данных для получения любых сообщений об ошибках массового копирования (укажите NULL, если файл сообщений не требуется).

    • Направление копирования: DB_IN из приложения впредставление или таблица или DB_OUT для приложения из таблицы или представления.

  5. Вызовите bcp_bind длякаждый столбец в массовой копии для привязки столбца к программной переменной.

  6. Заполните переменные программы данными и вызовите bcp_sendrow для отправки строки данных.

  7. После отправки нескольких строк вызовите bcp_batch, чтобы проверить уже отправленные строки.Рекомендуется вызывать bcp_batch хотя бы один раз на 1000 строк.

  8. После отправки всех строк вызовите bcp_done для завершения операции.

Если вам нужна межплатформенная реализация функций массового копирования, взгляните на FreeTDS .

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