2009-09-22 2 views
2

Я пытаюсь написать код для пакетного импорта множества строк в базу данных.Моя инструкция по вставке/обновлению SQL слишком неэффективна

В настоящее время я массово копирую необработанные данные (из файла CSV) в промежуточную таблицу, так что это все на стороне базы данных. Это оставляет меня с промежуточным столом, полным строк, которые идентифицируют «контакты». Теперь их нужно переместить в другие таблицы базы данных.

Далее я копирую строки из промежуточной таблицы, которые у меня еще нет в таблице контактов, и для тех, которые у меня уже есть, мне нужно обновить столбец с именем «GroupToBeAssignedTo», что указывает на более позднюю операцию Я выйду.

У меня такое чувство, что я собираюсь сделать это неправильно. Запрос неэффективен, и я ищу совет, как я мог бы сделать это лучше.

update [t1] 
set [t1].GroupToBeAssignedTo = [t2].GroupToBeAssignedTo from Contacts [t1] 
inner join ContactImportStaging [t2] on [t1].UserID = [t2].UserID AND [t1].EmailAddress = [t2].EmailAddress AND [t2].GUID = @GUID 
where not exists 
(
    select GroupID, ContactID from ContactGroupMapping 
    where GroupID = [t2].GroupToBeAssignedTo AND ContactID = [t1].ID 
) 

Может было бы лучше просто импортировать все строки без проверки дубликатов первым, а затем «чистый», данные после этого? Ищете предложения о том, где я ошибаюсь. Благодарю.

EDIT: Чтобы уточнить, вопрос касается MS SQL.

ответ

0

Далее я скопировать строки из промежуточной таблицы, что я уже не имею в таблице контактов

кажется, что означает, что ContactGroupMapping не имеет записей, соответствующие Contacts.id, в этом случае вам можно просто опустить EXISTS:

UPDATE [t1] 
SET  [t1].GroupToBeAssignedTo = [t2].GroupToBeAssignedTo 
FROM Contacts [t1] 
INNER JOIN 
     ContactImportStaging [t2] 
ON  [t1].UserID = [t2].UserID 
     AND [t1].EmailAddress = [t2].EmailAddress 
     AND [t2].GUID = @GUID 

Или я что-то отсутствует?

1

Этот ответ немного «Я бы не начать отсюда», но это так, как я бы это сделать;)

Если у вас есть выпуски Standard или Enterprise из MS SQL Server 2005, и у вас есть доступ к службам SQL Server Integration Services, такая вещь - это шаг к потоку данных.

  • Создать источник данных, связанный с файлом CSV (это быстрее, если он отсортирован по некоторому полю)
  • ... и еще к существующей таблице контактов (с помощью ORDER BY для сортировки тем же полем)
  • Do Merge Присоединиться к их общему полю - вам нужно будет использовать преобразование сортировки, если либо два источника уже не отсортированы
  • Сделайте условное разделение, чтобы сфокусироваться только на строки, которые еще не находятся в ваша таблица (то есть уникальное для таблицы поле «null», то есть объединение слияния фактически не слилось для этой строки)
  • Используйте пункт назначения OLEDB для ввода в таблицу.

Возможно, более индивидуальные шаги, чем один оператор insert-with-select, но он сохранит вашу постановку, и это довольно интуитивно понятно. Кроме того, вы, вероятно, уже получили лицензию на его использование, и это довольно просто :)

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