首页 > 编程问答 >如何在不使数据库过载的情况下从 SQL Server 中的 600 万行表中迁移数据

如何在不使数据库过载的情况下从 SQL Server 中的 600 万行表中迁移数据

时间:2024-08-07 03:57:59浏览次数:13  
标签:python sql-server database migration

由于资源限制,我在将数据从具有 600 万行的表迁移到 SQL Server 数据库中的另一个表时遇到困难。数据库相对较小,当我一次发送 100,000 行时,DTU 使用率飙升至 100%,这会损害系统的性能和稳定性。我尝试了多种迁移方法,包括:|| |使用Python进行批处理

使用INSERT SELECT命令

  • 将CSV文件中的数据导入到目标表
  • 但是,所有这些方法都会导致数据库过载,并且不能有效地实现平滑迁移。 ||在不导致数据库资源利用率过高的情况下迁移大量数据的最佳实践或技术是什么?是否有一种有效的方法可以将迁移分解为更小的步骤,而不会使处理花费太多时间,或者优化流程以最大程度地减少对数据库的影响?
  • Importing data from a CSV file to the destination table

However, all these approaches have resulted in database overload and have not been effective for a smooth migration.

What are the best practices or techniques to migrate large volumes of data without causing high resource utilization in the database? Is there an efficient way to break the migration into smaller steps without making the processing take too many hours, or optimize the process to minimize the impact on the database?


说得对,从具有 600 万行的表中迁移数据而不会使数据库过载需要采用一种策略性的方法,尤其是在资源有限的情况下。以下是一些可以最大限度地减少对数据库影响的最佳实践、技术和将迁移分解为更小的步骤的方法:

1. 优化数据库和查询

  • 为迁移操作添加索引: 在目标表中,为用于 INSERT 操作的列创建索引(如果尚不存在)。这可以通过减少插入新行时数据库必须执行的工作量来显着提高插入性能。迁移完成后,请记住删除这些索引或重新创建原始索引。
  • 禁用约束: 在迁移过程中暂时禁用目标表上的外键约束和检查约束可以提高性能。迁移完成后重新启用它们,并对数据运行完整性检查以确保没有任何问题。
  • 增加批处理大小: 尝试增加用于 Python 脚本中批处理操作或 INSERT 语句的批处理大小。这可以通过减少发送到数据库的请求总数来提高性能。根据的系统,从 1,000 到 5,000 或 10,000 行开始,然后根据需要进行调整。
  • 使用分区: 如果的 SQL Server 版本支持,请考虑对大型表进行分区。这可以使数据管理和迁移任务更加高效。可以分批迁移分区,从而最大限度地减少对整个数据库的影响。

2. 分步迁移

  • 基于时间的切片: 不是一次性迁移所有 600 万行,而是根据创建时间戳或其他适合数据的日期列,将数据分成较小的块。例如,可以每天或每周迁移数据。
  • 使用标识列分块: 如果的表有一个标识列或其他顺序列,可以使用它将数据分成块。例如,可以迁移 ID 从 1 到 100,000 的行,然后迁移 ID 从 100,001 到 200,000 的行,依此类推。

3. 最小化日志记录

  • 使用最小记录或简单恢复模式: 如果适用,请考虑在迁移过程中暂时将数据库或目标表的恢复模式切换为“简单”或“批量记录”。这可以显着减少日志记录开销,但请注意,如果在迁移过程中发生故障,将无法恢复到该时间点。迁移完成后,请记住将恢复模式切换回原始设置。
  • 使用 SELECT INTO 如果适用,请考虑使用 SELECT INTO 语句将数据批量加载到新表中。这通常比 INSERT 语句更高效,因为它对事务日志的压力较小。

4. 使用链接服务器或 SSIS

  • 链接服务器: 设置源数据库和目标数据库之间的链接服务器,并使用 INSERT INTO...SELECT 语句通过链接服务器迁移数据。这使可以直接从目标服务器查询和插入数据,从而有可能减少网络开销。
  • SQL Server Integration Services (SSIS): SSIS 提供了一个强大的平台,用于构建和管理数据迁移包。它提供了用于优化和自动化整个过程的各种功能,包括数据流组件和变换。

5. 数据库外的迁移工具

  • 第三方工具: 探索专门设计用于大量数据迁移的第三方工具。这些工具通常提供高级功能,例如自动化、并行处理和数据完整性验证,以简化和优化迁移过程。

监控和调整

在实施任何这些技术时,请务必密切监控数据库服务器的性能(CPU 利用率、内存使用率、磁盘 I/O)并在需要时进行调整。

请记住,没有一种万能的解决方案。为的特定情况选择最佳方法取决于各种因素,例如的数据库大小、资源约束、停机时间容忍度和对数据完整性的要求。彻底测试不同的选项并选择最适合的需求的选项非常重要。

标签:python,sql-server,database,migration
From: 78840809

相关文章

  • ArcPro (3.2+) Python 脚本工具中从 .atbx Toolbox 相对导入本地模块
    我设置了一个库和关联的ArcGISToolbox,以便:/root├──Toolbox.atbx├──mylib│└──my_function.py├──my_tools│└──my_gp_script.py我将代码存储库的开发克隆保存在公司共享服务器上的一个位置,并在GitHub上托管一份副本。当我进行更新时,我会......
  • Python vs. R:揭秘机器学习领域的双璧
    一、引言1.1背景介绍随着大数据和人工智能技术的飞速发展,机器学习已经成为了一个热门领域。在机器学习领域,Python和R是两种广泛使用的编程语言。Python因其简洁易读的语法和强大的库支持,成为了最受欢迎的编程语言之一。而R则以其强大的统计分析和数据可视化能力,在统计学......
  • Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10
    Windows10安装编译后的pysqlcipher3-1.2.1基于Python3.8.10本文主要是将直接安装编译后的文件,不一定的成功,但是可以尝试使用,若无法直接安装,请参考编译过程,自行编译安装,编译过程见这里安装pysqlcipher3这里用32位举例因为64位安装完全相同,只需要把对应的位数换成64......
  • 【Python】Python基础语法知识点汇集
    Python是一种高级的、解释型的编程语言,以其清晰的语法和代码可读性而闻名。本篇文章将汇集Python编程的基础语法知识点,为初学者提供一个全面的学习指南。......
  • 启动Python 的内置服务器访问本地图片
    要使用Python的内置服务器访问本地图片并正确地显示在浏览器中,你需要将图片文件放在内置服务器的根目录或其子目录中。以下是详细步骤:1.将图片文件复制到服务器根目录:例如,将zheng.jpeg文件复制到一个特定的目录中(例如,你的项目目录)。假设你将图片文件复制到C:\Users\panda......
  • 17:Python数据类型练习题
    #1获取c1,c2相同的元素列表c1=[11,22,33]c2=[22,33,44]foriinc1:ifiinc2:print(i)#2获取c1中有,c2没有的元素列表foriinc1:ifinotinc2:print(i)#3获取c2中有,c1没有的元素列表foriinc2:ifinotinc1:print(i)#4获......
  • (Jmeter新玩法)Python 调 Jmeter执行参数化jmx脚本
    #Python调Jmeter执行参数化jmx脚本importosfromos.pathimportjoinimporttimeimportrefromstringimportTemplatejmeter_Home=r"F:\softtotal\xxx\bin\jmeter.bat"#jmx文件路径currpath=os.path.dirname(os.path.realpath(__file__))#要运行的jmx脚......
  • python爬虫预备知识三-多进程
    python实现多进程的方法:fork、multiprocessing模块创建多进程。os.fork方法os.fork方法只适合于unix/linux系统,不支持windows系统。fork方法调用一次会返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,fork方法分别在父进程和子进程中......
  • PEP 8 – Python 代码风格指南中文版(七)
    编程建议(2) 定义异常时,应该从Exception类继承,而不是从BaseException类继承。直接从BaseException继承的异常通常是那些几乎不应该被捕获的异常。设计异常层次结构时,应该基于捕获异常的代码可能需要进行的区分,而不是基于异常被抛出的位置。目标是通过编程方式回答“出了......
  • Python-记录一次迭代求和
    importitertoolsdefget_result(hope,list_input):""":paramhope:#期望相加所得参数:paramlist_input:#所有数值:return:"""defgenerate_combination(items,length):forcombinationinitertools.co......