通过SQL Server中的select插入百万条记录

时间:2015-05-05 05:57:39

标签: sql-server sql-server-2008 tsql sql-server-2008-r2

INSERT INTO CCP_D2
                (CONT_MAS_SID,
                 COMP_M_SID,
                 ITM_M_SID)
    SELECT DISTINCT CM.CONT_MAS_SID,
                    CMP_MAS.COMP_M_SID,
                    IM.ITM_M_SID
    FROM   CONT_MAS CM
           INNER JOIN CFP_C CCT
                   ON CM.CONT_MAS_SID = CCT.CONT_MAS_SID
                      AND CM.IN_STATUS <> 'D'
                      AND CCT.IN_STATUS <> 'D'
           INNER JOIN CFP_C_DET CCD
                   ON CCT.CFP_C_SID = CCD.CFP_C_SID
           INNER JOIN COMP_M CMP_MAS
                   ON CMP_MAS.COMP_M_SID = CCD.COMP_M_SID
                      AND CMP_MAS.IN_STATUS <> 'D'
           INNER JOIN IFP_C IFP_CONT
                   ON IFP_CONT.CFP_C_SID = CCT.CFP_C_SID
                      AND IFP_CONT.IN_STATUS <> 'D'
                      AND CM.CONT_MAS_SID = IFP_CONT.CONT_MAS_SID
           INNER JOIN IFP_C_DET ICD
                   ON IFP_CONT.IFP_C_SID = ICD.IFP_C_SID
           INNER JOIN ITM_M IM
                   ON IM.ITM_M_SID = ICD.ITM_M_SID
                      AND IM.IN_STATUS <> 'D'
    WHERE  NOT EXISTS (SELECT 1
                       FROM   CCP_D CD
                       WHERE  CD.CONT_MAS_SID = CM.CONT_MAS_SID
                              AND CD.COMP_M_SID = CMP_MAS.COMP_M_SID
                              AND CD.ITM_M_SID = IM.ITM_M_SID)

- 返回的记录数= 209519554

enter image description here

我有一个返回近2000万条记录的sql。我想将结果插入表中。 它的工作正常,记录数量较少,但当记录数达到百万时,即使我对所有连接列都有适当的索引,也需要大约1小时30分钟才能完成。

我尝试了以下事情

  1. 使用while循环分割为多个批量插入,但在这种情况下不起作用。
  2. 创建了所有推荐的索引,但性能未按预期进行改进。
  3. 注意:我不喜欢分区,因为我使用的是sql server标准版。

    您能否提出任何方法来改善此查询的效果。

2 个答案:

答案 0 :(得分:0)

要记住的一件事是,当您在表中插入行时,索引和约束会产生额外的开销,因为必须重新组织索引结构以将新值放入索引页中。此外,约束是评估预定义表达式上每一行的机制。

如果要更快地导入到表中,尤其是在大量数据的情况下,请禁用所有约束和索引,然后在导入过程后重新启用它们。

当然,您必须确保新行不会破坏数据库的一致性和完整性。

如果禁用主键约束,从而禁用聚簇索引,则必须知道外键也会自动禁用。启用聚簇索引或主键约束时,不会自动启用外键约束,因此必须手动启用它们。

答案 1 :(得分:-1)