Подтвердить что ты не робот

Как вставить миллионы данных из разных СУБД в базу данных SQL Server с помощью инструкции insert?

У меня есть две базы данных на моем SQL Server, каждая из которых содержит одну отдельную таблицу.

У меня есть 2 базы данных, как показано ниже:

1) Db1 (MySQL)

2) Db2 (Oracle)

Теперь я хочу заполнить таблицу базы данных SQL Server db1 данными из Db1 из MySQL, как показано ниже:

Insert into Table1 select * from Table1

Выберите * из таблицы1 (Mysql Db1) - данные, поступающие из базы данных Mysql

Вставить в таблицу 1 (сервер Sql Db1) - вставить данные, поступающие от Mysql с учетом той же схемы

Я не хочу использовать sqlbulk-копию, поскольку я не хочу вставлять кусок по данным куска. Я хочу вставить все данные в один проход, рассматривая миллионы данных, так как моя операция не ограничивается вставкой записей в базу данных. Таким образом, пользователь должен сидеть ждать долгое, как первые миллионы данных, вставляя кусок с помощью chunk в базе данных, а затем снова для моей дальнейшей операции, которая также долго работает.

Итак, если у меня ускоряется этот процесс, то у меня может быть и вторая операция, которая ускорит рассмотрение всех записей в моем 1 локальном экземпляре sql-сервера.

Можно ли это сделать в приложении С#?

Обновление: Я исследовал связанный сервер как @GorDon Linoff предложил мне, что связанный сервер может использоваться для достижения этого сценария, но на основе моих исследований кажется, что я не могу создать связанный сервер с помощью кода.

Я хочу сделать это с помощью ado.net.

Это то, что я пытаюсь сделать точно:

У меня есть две разные клиентские РСУБД с 2 базами данных и некоторыми таблицами в клиентских помещениях.

Итак, база данных такова:

Sql Server :

Db1

Order
Id      Amount
1       100
2       200
3       300
4       400


Mysql or Oracle :

Db1:

Order
Id      Amount
1       1000
2       2000
3       3000
4       400

Теперь я хочу сравнить столбцы Amount от источника (SQL Server) до базы данных назначения (MySQL или Oracle).

Я буду использовать, чтобы присоединиться к этим двум различным таблицам баз данных СУБД, чтобы сравнить столбцы Amount.

В С# то, что я могу сделать, это как выборка chunk записями chunk в моем datatable (в памяти), тогда сравните эти записи с помощью кода, но это займет много времени, учитывая миллионы записей.

Итак, я хочу сделать что-то лучше этого.

Следовательно, я думал, что я выведу из этих двух записей RDBMS в своем локальном экземпляре SQL Server в 2 базах данных, а затем создаю запрос присоединения, соединяющий эти 2 таблицы на основе Id, а затем воспользуюсь возможностями обработки СУБД, которые могут сравнивать эти миллионы эффективно записывает.

Подобный запрос сравнивает миллионы записей:

select SqlServer.Id,Mysql.Id,SqlServer.Amount,Mysql.Amount from SqlServerDb.dbo.Order as SqlServer
Left join MysqlDb.dbo.Order as Mysql on SqlServer.Id=Mysql.Id
where SqlServer.Amount != Mysql.Amount

Выше запрос работает, когда у меня есть это 2 разных RDBMS-данных в моем экземпляре локального сервера с базой данных: SqlServerDb и MysqlDb, и это будет извлекать ниже записи, количество которых не соответствует:

Итак, я пытаюсь получить эти записи из источника (Sql server Db) в MySQL, значение столбца которого не соответствует.

Ожидаемый результат:

Id      Amount
1       1000
2       2000
3       3000

Итак, есть ли способ достичь этого сценария?

4b9b3361

Ответ 1

На стороне SELECT создайте файл .csv (с разделителем табуляции) с помощью SELECT ... INTO OUTFILE ...

На стороне INSERT используйте LOAD DATA INFILE ... (или независимо от синтаксиса целевого компьютера).

Выполнение всего этого может быть проще для кода, чем для chunking, и может (или не быть) работать быстрее.

Ответ 2

SqlBulkCopy может принимать как DataTable, так и System.Data.IDataReader.

Используя ваш запрос для чтения исходного БД, настройте ADO.Net DataReader в исходном MySQL или Oracle DB и передайте читателю метод WriteToServer() SqlBulkCopy.

Это может копировать почти любое количество строк без ограничений. Я скопировал сотни миллионов строк, используя подход чтения данных.

Ответ 3

Как добавить дату изменения в удаленную базу данных.

Затем вы можете получить все строки, которые были изменены с момента последней синхронизации, и просто сравнить их?

Ответ 4

Прежде всего, не используйте связанный сервер. Это заманчиво, но это вызовет больше проблем, чем приносит на стол. Подобные обновления и вставки будут извлекать все целевые db в исходный db и вставлять/обновлять и отправлять все данные для возврата назад.

Насколько я понимаю, вы пытаетесь скопировать измененные данные в целевую систему для некоторых вещей.

Я рекомендую использовать столбец timestamp в исходной таблице. Когда все изменения в столбце timestamp таблицы источника обновляются сервером sql.

В цель, получите максимальный идентификатор и максимальную метку времени. два запроса при макс.

В источнике, строки, где source.ID <= target.MaxID && source.timestamp >= target.MaxTimeTamp - true, являются строками, которые изменились после последней синхронизации (необходимо обновление). И строки, где source.ID > target.MaxID - true, являются строками, которые вставляются после последней синхронизации.

Теперь вам не нужно сравнивать два мира, и вы просто получили все обновления и вставки.

Ответ 5

Вам необходимо создать соединение с подключенным сервером с помощью ODBC и соответствующего драйвера, после чего вы можете выполнить запросы с помощью openquery.

Взгляните на openquery:

https://msdn.microsoft.com/en-us/library/ms188427(v=sql.120).aspx

Ответ 6

Да, SQL Server очень эффективен, когда он работает с наборами, поэтому сохраняйте это в игре.

Вкратце, то, что я пишу,

  • Загружать данные из источника в промежуточную таблицу в целевой базе данных (промежуточная таблица = таблица для временного хранения необработанных данных из исходной таблицы, той же структуры, что и исходная таблица... добавлять столбцы отслеживания по вкусу). Это будет сделано с помощью кода С#... выберите from source_table в DataTable, затем SqlBulkCopy в промежуточную таблицу.

  • Имейте хранимый proc в целевой базе данных для согласования данных между вашей целевой таблицей и промежуточной таблицей. Ваш код С# вызывает сохраненный процесс.

Учитывая, что вы говорите о миллионах строк, еще одна вещь, которая может ускорить работу, - это отбрасывать индексы в промежуточной таблице, прежде чем вставлять в нее и воссоздавать их после вставок и до того, как будет выполнен какой-либо выбор.