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标准版。
您能否提出任何方法来改善此查询的效果。
答案 0 :(得分:0)
要记住的一件事是,当您在表中插入行时,索引和约束会产生额外的开销,因为必须重新组织索引结构以将新值放入索引页中。此外,约束是评估预定义表达式上每一行的机制。
如果要更快地导入到表中,尤其是在大量数据的情况下,请禁用所有约束和索引,然后在导入过程后重新启用它们。
当然,您必须确保新行不会破坏数据库的一致性和完整性。
如果禁用主键约束,从而禁用聚簇索引,则必须知道外键也会自动禁用。启用聚簇索引或主键约束时,不会自动启用外键约束,因此必须手动启用它们。
答案 1 :(得分:-1)