Мой оператор вставки / обновления SQL слишком неэффективен - PullRequest
2 голосов
/ 22 сентября 2009

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

В настоящее время я массово копирую необработанные данные (из файла .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
)

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, вопрос касается MS SQL.

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Этот ответ немного "Я бы не начал отсюда", но я бы так и сделал;)

Если у вас есть стандартные или корпоративные выпуски MS SQL Server 2005, и у вас есть доступ к службам интеграции SQL Server, такие вещи - пустяки, связанные с потоком данных.

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

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

0 голосов
/ 22 сентября 2009

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

Похоже, что 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 

Или я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...