我的SQL插入/更新语句效率太低

时间:2009-09-22 10:54:53

标签: sql sql-server

我正在尝试编写代码,批量导入大量行到数据库中。

目前,我将原始数据(从.csv文件)批量复制到临时表中,以便全部在数据库端。这给我留下了一个充满行标识“联系人”的临时表。现在需要将它们移动到数据库的其他表中。

接下来,我将来自临时表中的行复制到contacts表中我尚未拥有的行,对于我已经拥有的行,我需要更新名为“GroupToBeAssignedTo”的列,指示稍后的操作I将表演。

我有一种感觉,我错了。查询效率不高,我正在寻找有关如何做得更好的建议。

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 个答案:

答案 0 :(得分:1)

这个答案略有“我不会从这里开始”,但这是我做的方式;)

如果您已获得MS SQL Server 2005的标准版或企业版,并且您可以访问SQL Server Integration Services,那么这类事情与数据流有关。

  • 创建一个链接到CSV文件的数据源(如果按某个字段排序则更快)
  • ...和现有联系人表格中的另一个(使用ORDER BY按相同字段对其进行排序)
  • 在他们的公共字段上进行合并加入 - 如果两个来源尚未排序,则需要使用排序转换
  • 执行条件拆分以仅关注表中尚未存在的行(即表唯一字段为“null”,即合并连接实际上并未为该行合并)
  • 使用OLEDB目的地输入表格。

可能比单个insert-with-select语句更多的单个步骤,但它将保存您的暂存,并且它非常直观。此外,您可能已获得使用许可,而且非常简单:)

答案 1 :(得分: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 

或者我错过了什么?