Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过SQL Server中的select插入百万条记录_Sql Server_Sql Server 2008_Tsql_Sql Server 2008 R2 - Fatal编程技术网

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

Sql server 通过SQL Server中的select插入百万条记录,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,-返回的记录数=209519554 我有一个返回近2000万条记录的sql。我想将结果插入到表中。 它可以很好地处理较少的记录,但当记录数达到百万时,需要大约1小时30分钟才能完成,即使我对所有连接列都有适当的索引 我试过以下的方法 使用while循环拆分为多批插入,但在这种情况下不起作用。 已创建所有建议的索引,但性能未按预期提高。 注意:我不喜欢分区,因为我使用的是SQLServer标准版 请您提出任何改进此查询性能的方法。请记住,在表中插入行时,索引和约束会产生额外的开销,因为必须重新组

-返回的记录数=209519554

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

我试过以下的方法

使用while循环拆分为多批插入,但在这种情况下不起作用。 已创建所有建议的索引,但性能未按预期提高。 注意:我不喜欢分区,因为我使用的是SQLServer标准版


请您提出任何改进此查询性能的方法。

请记住,在表中插入行时,索引和约束会产生额外的开销,因为必须重新组织索引结构,以便将新值放入索引页。此外,约束是一种机制,用于计算预定义表达式上的每一行

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

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

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

这可能有助于您:


希望这能帮助你找到你想要的

@mohan:谢谢分享链接,我不是在寻找bcp或bulk insert,因为我必须将sql查询的结果集插入到一个表中。你能发布你的批量插入解决方案吗?我的数据库处于简单恢复模式。问题是select query,获取记录只需一个多小时。即使我计划删除并重新创建索引,但not exists子句中引用了相同的表。我必须在sql server存储过程中实现这一点。我认为给定的解决方案不适合我。
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)