【问题标题】:Better way to check if the data already exists and insert检查数据是否已经存在并插入的更好方法
【发布时间】:2011-08-22 08:49:04
【问题描述】:

大家好,我有以下 SQL Server 2008 脚本,它将检查 Table A 中是否已存在一行,以及它是否不插入来自 Table B 的数据。

这一直很好,直到Table A 开始填充大量数据。我们目前在这个表中有 3000 万行,并且这将继续增长到预测的 7000 万行。

如果这花费的时间太长并且影响其他进程,则会出现问题。只是想知道是否有更好的方法来检查表中是否已存在行。顺便说一句,这一切都是使用 SSIS 完成的。

脚本:

INSERT INTO TABLE A ([recordID],Field 1, Field2, Field 3, Field 4, Field 5) 
    SELECT 
        [TABLE B].[recordID],[TABLE B].[Field 1], [TABLE B].[Field2], 
        [TABLE B].[Field 3], [TABLE B].[Field 4], [TABLE B].[Field 5] 
    FROM TABLE B AS TABLE B 
    LEFT OUTER JOIN TABLE A AS TABLE A ON [TABLE B].[recordID] = [TABLE A].[recordID] 
    WHERE [TABLE A].[recordID] IS NULL

【问题讨论】:

  • 确保正确的非聚集索引到位 - 最值得注意的是在 Table ATable B 中的 RecordID 列(因为这在您的 JOIN 条件中)
  • 我已经在表 A 和表 B 上有了 RecordID 的索引。但是我已经将它们设置为集群,它们应该是非集群的吗?

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


【解决方案1】:

【讨论】:

    【解决方案2】:

    不确定这是否会更快,但值得一试:

    INSERT INTO TABLE A ([recordID],Field 1, Field2, Field 3, Field 4, Field 5)
    
    SELECT [TABLE B].[recordID],[TABLE B].[Field 1], [TABLE B].[Field2], [TABLE B].[Field 3], [TABLE B].[Field 4], [TABLE B].[Field 5] 
    FROM TABLE B 
    where b.recordID not in 
         (select recordID from A)
    

    【讨论】:

    • +1 - NOT INNOT EXISTS 在大多数用例中比 LEFT JOIN 快​​得多。
    【解决方案3】:
    1. 如果是聚集索引,并且新添加的 RecordId 不是增量的,那么预计会发生大量页面溢出。确保设置最佳填充系数。
    2. 找出什么操作需要时间,那么解决起来就很简单了。是搜索耗时还是插入耗时?

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 2020-02-04
      • 2015-07-12
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多