2015-05-05 109 views
4
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) 

--number返回= 209519554插入万条记录,通过选择在SQL Server中的记录

enter image description here

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

我使用while循环而不是在这种情况下,工作的尝试下面的事情

  1. 分裂,以多发性批量插入。
  2. 创建所有建议的索引,但性能没有按预期提高。

注:我不喜欢分区,因为我使用的是sql server标准版。

请问您可以使用任何方式来改善此查询的性能。

+0

http://stackoverflow.com/questions/13722014/insert-2-million-rows-into-sql-server-quickly – mohan111

+0

@mohan:感谢分享链接,我不是在寻找bcp或批量插入,因为我必须将sql查询的结果集插入到表中。 – StackUser

+0

你可以发布你的批量插入解决方案吗? –

回答

0

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

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

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

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

+0

问题是选择查询,它只需要一个多小时的时间来获取记录。即使我计划删除并重新创建索引,但在not exists子句中引用了同一个表。 – StackUser