【问题标题】:How to Make this SQL Task Faster to Complete如何使这个 SQL 任务更快地完成
【发布时间】:2009-06-30 16:57:22
【问题描述】:

假设表 1 有 1,000,000 行。在表 2 中有 50,000 行

输入

表 1

Id    User   InternetAmountDue
1     joe    NULL

表 2

InternetUserId   UserName AmountDue
21                kay     21.00
10091             joe     21.00 

我想将表2中的数据合并到表1中,如下:

  1. 如果用户存在于表 1 中,则更新 InternetAmountDue 列
  2. 否则,插入新用户

输出

表 1

Id    User   InternetAmountDue
1     joe    21.00
2     kay    21.00

在涉及大量数据的情况下,如何快速完成这项工作?

【问题讨论】:

  • 所以要在 Table1.User 上对 Table2.UserName 进行匹配?是否区分大小写?如果有重复怎么办?
  • @ AakashM Table1.User 对 Table2.UserName -> 是否区分大小写正确 -> 默认排序规则在表 1 或 2 中没有重复项。

标签: sql sql-server sql-server-2008


【解决方案1】:

SQL Server 2008 为您的情况提供了特殊的构造 MERGE

MERGE
INTO    table1 AS t1
USING   table2 AS t2
ON      t2.UserName = t1.user
WHEN MATCHED THEN
        UPDATE
        SET    t1.AmountDue = t2.AmountDue
WHEN NOT MATCHED THEN
        INSERT (user, InternetAmountDue)
        VALUES (t2.UserName, t2.AmountDue)

【讨论】:

  • +1 就像我喜欢以前 SQL 版本中的旧 'UPSERT' 一样,MERGE 让生活变得如此轻松
【解决方案2】:
INSERT INTO Table1 (User)
SELECT UserName
FROM Table2
WHERE UserName not in (SELECT User FROM Table1)
 --
UPDATE t1
SET t1.InternetAmountDue = t2.AmountDue
FROM Table1 t1
  JOIN Table2 t2
  ON t1.User = t2.UserName

确保 Table2.UserName 已编入索引。 确保 Table1.User 已编入索引。

【讨论】:

    【解决方案3】:

    假设您要在查询中动态合并数据,您可以执行以下操作:

    select 
      t1.id,
      t1.user,
      case 
         when t2.AmountDue is not null then t2.AmountDue
         else t1.InternetAmountDue
      end as InternetAmountDue
    from table1 t1
    left join table2 t2
    on t1.user = t2.username
    

    用新的金额更新表 1 当然同样容易。

    【讨论】:

      【解决方案4】:

      查看UPSERT 声明。它可能是您正在寻找的。​​p>

      【讨论】:

        【解决方案5】:

        如果使用 ID 而不是名称,这将最快。由于您是按姓名加入的,因此您的性能会降低,并且可能会出现重复。

        一旦您解决了重复问题并准备好进行更新,您应该:

        您应该先执行更新
        然后进行插入

        考虑重新索引

        【讨论】:

          【解决方案6】:

          试试这个。

          UPDATE [Table 1]
          SET InternetAmountDue = t2.AmountDue
          FROM [Table 1] t1
          INNER JOIN [Table 2] t2
          ON t1.User = t2.UserName
          
          INSERT INTO [Table 1] ( User, InternetAmountDue )
          SELECT UserName, AmountDue 
          FROM [Table 2] t2
          LEFT OUTER JOIN [Table 1] t1
          ON t1.User = t2.UserName
          WHERE t1.User IS NULL
          

          【讨论】:

          • UPDATE 中的旧连接语法是什么??
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多