sql-server - SQL Server中通过select插入百万条记录

标签 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 分钟才能完成。

我尝试了以下事情
  • 使用 while 循环拆分为多个批量插入,但在这种情况下不起作用。
  • 创建了所有推荐的索引,但性能没有按预期提高。

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

    您能否提出任何提高此查询性能的方法。

    最佳答案

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

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

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

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

    关于sql-server - SQL Server中通过select插入百万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30045281/

    相关文章:

    sql - 更新(替换部分值)SQL 中的 XML 列

    c# - ADO.NET 从 datagrid1 中选择一行以显示 datagrid2 中的行

    sql-server - SSRS - 无法确定作业所有者是否具有服务器访问权限 [SQLSTATE 42000](错误 15404))

    c# - 将静默 SQL Server 安装的输出重定向到 C# 中的标准错误?

    sql-server-2008 - SQL Server DBCC 不显示输出

    sql - 相同外键的两列的 INNER JOIN

    sql-server - 区分 Sybase ASE 和 Microsoft SQL Server

    PHP 通过 PDO 从 Linux 连接到 MS SQLServer 2008

    sql - 需要弄清楚如何解析 GETDATE() 以将其与表中的 HHMMSS 值进行比较以查找耗时

    sql-server - 为什么 Intellisense 在 SQL Server Management Studio 2008 R2 中不起作用?