sql-server-2008 - SQL Server 中非常大的表的更新或合并

标签 sql-server-2008 sql-update sql-merge

我需要每天更新一个非常大的(300M 记录)和广泛的 TABLE1 .更新的源数据位于另一个表 UTABLE 中。即 TABLE1 行的 10%-25%但很窄。两个表都有 record_id作为主键。

目前,我正在重新创建 TABLE1使用以下方法:

<!-- language: sql -->
    1) SELECT (required columns) INTO TMP_TABLE1 
    FROM TABLE1 T join UTABLE U on T.record_id=U.record_id  
    2) DROP TABLE TABLE1  
    3) sp_rename 'TMP_TABLE1', 'TABLE1'

但是,这在我的服务器上需要将近 40 分钟(SQL Server 的 RAM 为 60GB)。我想实现 50% 的性能提升 - 我可以尝试哪些其他选项?
  • MERGEUPDATE - 类似下面的代码仅适用于很小的 UTABLE 的速度更快 table - 在全尺寸下,一切都悬而未决:
    <!-- language: SQL -->
    MERGE TABLE1 as target  
    USING UTABLE as source  
    ON target.record_id = source.record_id   
      WHEN MATCHED THEN   
        UPDATE SET Target.columns=source.columns
    
  • 我听说我可以使用 ROWCOUNT 执行批量合并 - 但我认为它对于 300M 行表来说不够快。
  • 任何有用的 SQL 查询提示?
  • 最佳答案

    实际上,我已经找到了针对此类查询的一般建议:使用 SQL Merge 或 Update 的想法非常聪明,但是当我们需要更新大量记录(即 75M )时它会失败表(即 240M )。

    看下面查询的查询计划我们可以说TABLE SCAN TABLE1 和最后的 MERGE正在占用 90% 的时间。

    MERGE TABLE1 as Target  
    USING UTABLE as source  
    ON Target.record_id = source.record_id   
    WHEN MATCHED AND (condition) THEN   
        UPDATE SET Target.columns=source.columns
    

    因此,为了使用 MERGE,我们需要:
  • 减少我们需要更新的行数,并将此信息正确传递给 SQL Server。这可以通过制作 UTABLE 来完成。更小或指定附加 condition这缩小了要合并的部分。
  • 确保要合并的部分适合内存,否则查询运行速度会变慢。制作 TABLE1减少两倍将我的实际查询时间从 11 小时减少到 40 分钟。

  • 正如马克提到的,你可以使用 UPDATE语法和使用 WHERE子句缩小要合并的部分 - 这将产生相同的结果。另外请避免索引 TABLE1因为这将导致在 MERGE 期间重建索引的额外工作

    关于sql-server-2008 - SQL Server 中非常大的表的更新或合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001980/

    相关文章:

    sql-server - MS SQL 自动递增非标识列

    SQL - 更新语句的外键约束错误

    sql - 使用带有 MAX() 的 GROUP BY 作为聚合与使用 ROW_NUMBER 进行分区相比,是否存在性能差异?

    php - MYSQL IF 语句按类别重新排序

    java - JPA:更新祖父实体时如何更新孙子实体?

    SQL MERGE 到远程(链接)服务器表

    postgresql - 如何在 PostgreSQL 中 UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE)?

    sql-server - 如何使用 XQuery-sql 在 XML 中查找祖先

    mySQL - 如何防止 count() 函数删除 0 计数?

    java - 如何在Java android中处理SQLite表的列?