2016-01-18 5 views
1

У меня есть огромный XML-файл (около 60 ГБ), из которого мне нужно извлечь данные. Я получаю новый обновленный XML-файл один раз в неделю, и мне нужно обновить данные в моей базе данных. Это файл с информацией о каждом автомобиле в Дании, поэтому информация каждого элемента может измениться с одной недели на другую. Мне удалось создать программу, которая может прочитать этот файл и извлечь каждый элемент и проанализировать его в моей базе данных. В настоящее время в XML-файле содержится 8 400 000 элементов. Сначала я попытался загрузить каждую строку в мою базу данных по одному разу, и мне удалось только вставить около 300 строк в секунду. Затем потребуется 7-8 часов, чтобы вставить все 8,4 миллиона строк. Поэтому я изменил свой читатель, чтобы сохранить 5000 записей во временной таблице данных, а затем объединить все 5000 строк сразу. Это увеличило мою скорость чтения/вставки до 7000 строк/сек. Огромное улучшение. Теперь я загружаю все элементы менее чем за 20 минут. Моя проблема в том, что я не могу обновить таблицу при использовании массовой вставки. Некоторые элементы перечислены дважды в файле XML по какой-либо причине, поэтому мне нужно удалить дубликаты в моей таблице, прежде чем добавить первичный ключ.Объединить 2 таблицы SQL в первичном ключе - обновить существующие и вставить новые строки

Мое текущее решение создать 2 таблицы в моей базе данных: dbo.eStatistik и dbo.eStatistikLoad

Затем я использую мой читатель, чтобы извлечь все 8400000 элементы из нового файла XML и навалом вставить их в DBO .eStatistikLoad. Когда все элементы находятся в dbo.eStatistikLoad, я удалю все повторяющиеся строки, а затем установлю столбец (KoeretoejIdent) в качестве моего ПЕРВИЧНОГО КЛЮЧА. Как только это будет сделано, я хочу обновить каждую существующую строку в dbo.eStatistik с данными из dbo.eStatistikLoad и вставить новые строки в dbo.eStatistik с данными из dbo.eStatistikLoad.

В настоящее время я могу вставлять и удалять повторяющиеся строки просто отлично, но я не знаю, как обновлять существующие строки и вставлять новые строки между двумя таблицами. Как уже отмечалось в обеих таблицах есть первичный ключ (KoeretoejIdent) после того, как я удалил дубликаты: Я пробовал эти команды, но я получаю сообщение об ошибке:

INSERT 
INTO dbo.eStatistik 
SELECT * 
FROM dbo.eStatistikLoad 
ON DUPLICATE KEY 
UPDATE 
     dbo.eStatistik.KoeretoejIdent = dbo.eStatistikLoad.KoeretoejIdent 
     dbo.eStatistik.KoeretoejArtNavn = dbo.eStatistikLoad.KoeretoejArtNavn 
     dbo.eStatistik.KoeretoejAnvendelseNavn = dbo.eStatistikLoad.KoeretoejAnvendelseNavn 

Я получаю следующее сообщение об ошибке:

Msg 156, Level 15, State 1, Line 52 
Incorrect syntax near the keyword 'ON'. 
Msg 102, Level 15, State 1, Line 54 
Incorrect syntax near '='. 

Я также попробовал эти две команды, но получить ту же ошибку:

/* COMMAND 1 */ 
REPLACE INTO dbo.eStatistik SELECT * FROM dbo.eStatistikLoad 

/* COMMAND 2 */ 
INSERT IGNORE 
    INTO dbo.eStatistik 
SELECT * 
    FROM dbo.eStatistikLoad 
    ; 

я получаю ту же ошибку при использовании обоих команд:

Msg 156, Level 15, State 1, Line 70 
Incorrect syntax near the keyword 'INTO'. 
+6

Ваше сообщение об ошибке выглядит как SQL Server. Ссылки на таблицы и использование XML также предлагают SQL Server. Тем не менее, ваш запрос использует синтаксис MySQL. 'ON DUPLICATE KEY' относится к MySQL. –

+2

Наличие отдельной таблицы для загрузки XML-данных в порядке. Фактически, это часто используемый подход. Эта концепция называется «постановка». Для вашей проблемы вам нужно что-то другое, кроме значения, генерируемого базой данных, чтобы идентифицировать записи в вашей основной таблице. Это будет база данных автомобилей, возможно, идентификационный номер транспортного средства будет полезен. –

ответ

2

Я бы воспользовался командой MERGE. Он поддерживается с MSSQL 2008, и он был разработан для сценариев, подобных вашим. Я не знаю, являются детали вашего решения так здесь только эскиз запроса:

MERGE dbo.eStatistik AS T 
USING dbo.eStatistikLoad AS S ON (T.KoeretoejIdent = S.KoeretoejIdent) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(KoeretoejIdent, KoeretoejArtNavn, KoeretoejAnvendelseNavn) 
      VALUES(S.KoeretoejIdent, S.KoeretoejArtNavn, S.KoeretoejAnvendelseNavn) 
WHEN MATCHED 
    THEN UPDATE SET 
     T.KoeretoejIdent = S.KoeretoejIdent, 
     T.KoeretoejArtNavn = S.KoeretoejArtNavn, 
     T.KoeretoejAnvendelseNavn = S.KoeretoejAnvendelseNavn; 

команды MERGE позволит вам сделать гораздо больше, чем в приведенном выше примере, например, для удаления записей. Вот еще article стоит прочитать с примерами использования MERGE.

+0

Здравствуйте, Michal, я получаю следующую ошибку: Неправильный синтаксис рядом с ключевым словом «INSERT». – TobiasKnudsen

+0

Исправлено. Были две команды INSERT вместо 1. –

+0

Да, я видел это, но когда я удалил это, я получил эту новую ошибку: Неправильный синтаксис рядом с 'T'. – TobiasKnudsen