2013-08-15 5 views
2

Я пытаюсь синхронизировать 2 набора таблиц, каждый набор (примерно) идентичен по структуре, один находится в базе данных Microsoft SQL Server и другой находится в базе данных MySQL, MSSQL имеет связанный сервер с базой данных MySQL LNK-SVRINSERT ... ON DUPLICATE KEY UPDATE быстрее DELETE/INSERT все записи

Мне интересно, что быстрее, удаляя каждую запись в одной таблице и вставляя ее снова с помощью запроса INSERT INTO ... SELECT FROM или используйте INSERT...ON DUPLICATE KEY UPDATE, чтобы были созданы новые записи и исправлены нарушения первичного ключа.

+0

Вы приурочили оба метода? – bhs

+0

@bhs еще не было, в прошлом DELETE/INSERT все записи работали нормально, потребовалось всего минуту для даже 100 000+ записей, однако мы начали запускать тесты на производственном сервере (та же настройка), и это чертовски много медленнее , так как есть много таблиц, которые синхронизируются как это, и у меня есть другие сценарии, над которыми мне нужно работать, чтобы ускорить работу из-за увеличения времени, когда я задаю этот вопрос, чтобы узнать, знает ли кто-нибудь, когда я работаю над другими сценариями (там похоже на 20 таблиц, которые будут иметь разные ответы на DUPLICATE KEY UPDATE) –

+0

Просто примечание ... но если источник - это живая БД, есть вероятность случайных ошибок синхронизации из-за изменений данных. Например: сначала копируется 'TableA', затем« ChildOfTableA »копируется через X секунду позже. Между ними новые записи вставляются в 'TableA' и' ChildOfTableA'. Поэтому, когда «ChildofTableA» скопирован, у него есть запись, которая должна FKey для «TableA» и ... boom. – EBarr

ответ

0

В Sql Server 2008 или раньше вы должны использовать оператор Merge для синхронизации двух таблиц:

Посмотрите на следующий образец: После запуска обе таблицы (@sourceTableand @targetTable) имеют одинаковые строки.

DECLARE @sourceTable TABLE(id INT PRIMARY KEY, somefield VARCHAR(255)) 

DECLARE @targetTable TABLE(id INT PRIMARY KEY, somefield VARCHAR(255)) 

INSERT INTO @sourceTable (id, somefield) VALUES(1, 'SourceValue1'), 
(3, 'SourceValue3') 

INSERT INTO @targetTable (id, somefield) VALUES(1, 
'TargetValue1'), (2, 'TargetValue2') 

SELECT * FROM @sourceTable SELECT * FROM @targetTable 

MERGE @targetTable AS target USING @sourceTable AS source 
ON target.id = source.id 
WHEN MATCHED THEN UPDATE SET somefield = source.somefield 
WHEN NOT MATCHED THEN INSERT (id, somefield) VALUES(id, source.somefield) 
WHEN NOT MATCHED BY source THEN DELETE; 

SELECT * FROM @sourceTable 
SELECT * FROM @targetTable 
+0

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

+0

Вы можете выполнить SELECT INTO для переноса данных на целевой сервер с помощью таблицы #temporary или переменной @Table. –

+0

Но это зависит от количества записей и запросов. Чтобы синхронизировать две таблицы, я всегда стараюсь MERGE, потому что я чувствую себя очень комфортно с синтаксисом, и производительность неплохая (в общем случае) –

Смежные вопросы