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
我有一个返回近 2000 万条记录的 sql。我想将结果插入到表格中。
它在记录数量较少的情况下工作正常,但是当记录数量达到百万时,即使我对所有连接列都有适当的索引,也需要大约 1 小时 30 分钟才能完成。
我尝试了以下事情
注意:我不喜欢分区,因为我使用的是 sql server 标准版。
您能否提出任何提高此查询性能的方法。
最佳答案
要记住的一件事是,在表中插入行时,索引和约束会产生额外的开销,因为必须重新组织索引结构才能将新值放入索引页中。此外,约束是通过预定义表达式评估每一行的机制。
如果你想更快地导入到表中,尤其是在大量数据的情况下,禁用所有约束和索引,然后在导入过程后重新启用它们。
当然,您必须确保您的新行不会破坏数据库的一致性和完整性。
如果禁用主键约束,从而禁用聚集索引,您必须知道外键也会自动禁用。启用聚集索引或主键约束时,外键约束不会自动启用,因此您必须手动启用它们。
关于sql-server - SQL Server中通过select插入百万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30045281/