Быстрый дамп таблицы SQL Server

У меня есть большая таблица в SQL Server 2008 R2. Он содержит миллиарды строк. Мне нужно загрузить весь набор данных в наше приложение. Запрос всей таблицы очень медленный. Я хочу использовать bcp, сбросить его в файл и загрузить. Но проблема в том, что есть строковые столбцы, содержащие всевозможные специальные символы, такие как '\t', '\0', запятая и '\n'. Я не могу найти хороший терминатор поля/строки. Но терминатор длинной строки замедляет загрузку файла данных для моего приложения. Вопрос в том:

  1. Есть ли какой-либо API, который загружает данные быстрее, чем SQL-запрос? Я обнаружил, что есть собственный API импорта IRowsetFastLoad. А вот с экспортом не повезло.
  2. Есть ли какой-либо API для собственного формата BCP? Я не могу найти документ о формате собственного файла bcp.

person Carl Z    schedule 14.03.2012    source источник
comment
Ваш поток данных немного неясен, что вы подразумеваете под загрузкой данных в ваше приложение? Верно ли, что вы будете экспортировать из SQL Server в плоский файл, а затем загружать этот плоский файл в свое приложение? Будет ли он загружать данные в память или обрабатывать их из файла как поток? Проблемы с производительностью связаны с экспортом данных из SQL Server или их загрузкой в ​​ваше приложение?   -  person Pondlife    schedule 15.03.2012


Ответы (3)


Из BOL:

-n

Выполняет операцию массового копирования, используя собственные типы данных (базы данных). Этот параметр не запрашивает каждое поле; он использует собственные значения.

Миллиарды строк? Тогда вы также захотите использовать:

-b размер_пакета

Указывает количество строк в пакете скопированных данных. Каждый пакет копируется на сервер как одна транзакция. SQL Server фиксирует или откатывает в случае сбоя транзакцию для каждого пакета.

Разве вы не можете получить доступ к двум базам данных одновременно, возможно, через Linked Server? Это облегчило бы задачу.

DECLARE @StartId BIGINT
DECLARE @NmbrOfRecords BIGINT
DECLARE @RowCount BIGINT

SET @StartId = 0
SET @NmbrOfRecords = 9999
SET @RowCount = 1

WHILE @RowCount > 0
BEGIN
  BEGIN TRANSACTION

  INSERT INTO DestinationDatabase.dbo.Mytable
  SELECT * FROM SourceDatabase.dbo.Mytable
  WHERE ID BETWEEN @StartId AND @StartId + @NmbrOfRecords

  SET @RowCount = @@ROWCOUNT

  SET @StartId = @StartId + @NmbrOfRecords + 1

  COMMIT TRANSACTION
END
person Wim    schedule 15.03.2012

API массовой вставки предоставляется программистам классом SqlBulkCopy:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

person Mike Chamberlain    schedule 15.03.2012
comment
Согласно документации, на которую вы ссылаетесь, это должно эффективно загружать таблицу SQL Server данными из другого источника, но OP хочет сделать прямо противоположное. - person Pondlife; 15.03.2012

Импорт и экспорт массовых данных с помощью утилиты bcp (SQL Server)

http://technet.microsoft.com/en-us/library/aa337544.aspx

Справочник по функциям массового копирования:

http://technet.microsoft.com/en-us/library/ms130922.aspx

person yucer    schedule 06.03.2014