加快从 pyodbc 插入 SQL Server 的速度

2023-11-26

In python,我有一个从一个数据库中选择数据的过程(Redshift via psycopg2),然后将该数据插入到SQL Server (via pyodbc)。我选择执行读/写而不是读/平面文件/加载,因为行数约为每天 100,000 行。似乎更容易简单地连接和插入。然而,插入过程很慢,需要几分钟。

有没有更好的方法使用 Pyodbc 将数据插入 SQL Server?

select_cursor.execute(output_query)

done = False
rowcount = 0

while not done:
    rows = select_cursor.fetchmany(10000)

    insert_list = []

    if rows == []:
        done = True
        break

    for row in rows:
        rowcount += 1

        insert_params = (
            row[0], 
            row[1], 
            row[2]
            )

        insert_list.append(insert_params)            

    insert_cnxn = pyodbc.connect('''Connection Information''')

    insert_cursor = insert_cnxn.cursor()

    insert_cursor.executemany("""
        INSERT INTO Destination (AccountNumber, OrderDate, Value)
        VALUES (?, ?, ?)
        """, insert_list)

    insert_cursor.commit()
    insert_cursor.close()
    insert_cnxn.close()

select_cursor.close()
select_cnxn.close()

UPDATE:pyodbc 4.0.19 添加了Cursor#fast_executemany该选项可以通过避免下面描述的行为来极大地提高性能。看这个答案了解详情。


您的代码确实遵循正确的形式(除了其他答案中提到的一些小调整),但请注意,当 pyodbc 执行.executemany它实际上做的是提交一个单独的sp_prepexec对于每个单独的行。也就是说,对于代码

sql = "INSERT INTO #Temp (id, txtcol) VALUES (?, ?)"
params = [(1, 'foo'), (2, 'bar'), (3, 'baz')]
crsr.executemany(sql, params)

SQL Server 实际上执行以下操作(由 SQL Profiler 确认)

exec sp_prepexec @p1 output,N'@P1 bigint,@P2 nvarchar(3)',N'INSERT INTO #Temp (id, txtcol) VALUES (@P1, @P2)',1,N'foo'
exec sp_prepexec @p1 output,N'@P1 bigint,@P2 nvarchar(3)',N'INSERT INTO #Temp (id, txtcol) VALUES (@P1, @P2)',2,N'bar'
exec sp_prepexec @p1 output,N'@P1 bigint,@P2 nvarchar(3)',N'INSERT INTO #Temp (id, txtcol) VALUES (@P1, @P2)',3,N'baz'

所以,对于一个.executemany“批量”10,000 行

  • 执行 10,000 次单独插入,
  • 到服务器的往返次数为 10,000 次,并且
  • 发送相同的 SQL 命令文本(INSERT INTO ...) 10,000 次。

It is possible让 pyodbc 发送一个初始的sp_prepare然后做一个.executemany呼叫sp_execute,但本质上.executemany你仍然会做10,000sp_prepexec调用,只是执行sp_execute代替INSERT INTO ...。如果 SQL 语句相当长且复杂,这可以提高性能,但对于像您问题中的示例这样的简短语句,可能不会产生太大影响。

人们还可以发挥创意并构建“表值构造函数”,如下所示这个答案,但请注意,当本机批量插入机制不是可行的解决方案时,它仅作为“B 计划”提供。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加快从 pyodbc 插入 SQL Server 的速度 的相关文章

  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • SQL Server 数据库架构版本控制和更新

    对于我的应用程序 我必须支持更新方案 并且数据库可能会受到影响 我希望能够从旧版本更新到最新版本 而无需安装中间版本 例如 假设我有版本 A 最旧的版本 B 中间版本 和 C 新版本 我希望能够将版本 A 直接更新到版本 C 对于应用程序文
  • 从 Sharepoint 到 SQL Server 的实时同步

    我见过许多将 SQL Server 数据同步到 SharePoint 的解决方案 但没有见过将 SharePoint 列表同步到 SQL Server 的解决方案 有谁知道解决方案吗 商业化就好了 或者 我需要编写一个 Web 部件来创建多
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • 在Ember中,如何推迟准备就绪,并将AJAX结果放入控制器中?

    我知道 Ember Application 现在有推迟准备状态这让我可以在初始化应用程序之前等待 AJAX 调用的返回 然而 在 api 文档的示例中 他们将值放入应用程序中的全局变量中 App Ember Application crea
  • 是否有 S3 策略限制访问只能查看/访问一个存储桶?

    我有一个简单的桶 看起来像images mysite com在我的 S3 和其他包含备份等的存储桶上 我想允许特定用户能够访问images mysite com存储桶以便上传图像 然而 我不想让他看到任何其他的桶 甚至不知道它们存在 我无法
  • MS Access 2003 不进入调试模式并忽略断点

    我在 MS Access 2003 模块中开发了一个小型 VBA 程序 只有一个公共子模块 该数据库仅对我锁定 其他人无法访问该文件 我的代码可以工作 但我想找到并修复一个小错误 我需要调试我的 VBA 代码 我在程序的第一行放置了断点 但
  • 多个 AWS 实例中的 MongoDB 负载均衡

    我们正在将 amazon Web 服务用于业务应用程序 该应用程序使用 Node js 服务器和 mongodb 作为数据库 目前 node js 服务器正在 EC2 介质实例上运行 我们将 mongodb 数据库保存在一个单独的微实例中
  • 以动画方式插入 ItemsControl

    我有时发现 WPF 难以理解 给定以下 XAML 如何添加触发器来为添加到 ObservableCollection 时间线的新项目添加动画 向下滑动 淡入 我见过各种列表框的例子 但没有看到项目控制的例子
  • 使用 Gradle 将所有创建的第三方 jar 复制到一个文件夹中

    我们有一个多项目 gradle 设置 每个子项目都有一个 Java jar root project sub project a sub project b sub project c 现在 因为我们正在创建一个 Java Webstart
  • 在 Google 数据存储(高复制)的单个事务中,有多少个对象“太多”?

    我有以下实体 不相关的字段 方法被删除 public class HitsStatsTotalDO Id transient private Long targetId public Key
  • 将 Rails Gem Active Admin 与关联结合使用

    我正在尝试新的 Rails gemhttp activeadmin info 而且效果很好 但是我找不到任何有关如何跨协会使用它的文档 例如 class Membership lt ActiveRecord Base belongs to
  • 在 PHPUnit 中,如何模拟不属于类的函数?

    我目前正在从事的项目包含面向对象和过程化 PHP 代码的混合体 所以我有这样的事情 function doStuff value x value 1 return x class MyClass private field public f
  • ACTION_USER_PRESENT、ACTION_SCREEN_ON、ACTION_BOOT_COMPLETED 的广播接收器

    我正在创建一个使用广播接收器的类 我想接收有关手机解锁的广播 但有一些问题 请帮帮我 我的 Manifest xml 是
  • 当表单再次显示时,单选按钮保存最后选中的而不是所需的按钮

    我有一些TRadioButtons on Form2并打电话Form2 from Form1用这个代码 procedure TForm1 btnCallForm2Click Sender TObject begin Form2 RadioB
  • Swift 异步加载图像

    我正在研究从 url 异步显示图像 我尝试创建一个新线程来下载图像 然后刷新main thread func asyncLoadImg product Product imageView UIImageView let downloadQu
  • 在 Spring Boot 中创建自定义 Jasypt PropertySource

    我正在使用 Spring Boot 创建一个访问数据库的简单 Web 应用程序 我通过设置来利用数据源的自动配置功能spring datasource 属性在application properties 一切都非常顺利 而且速度非常快 干得
  • 在 Libgdx 屏幕之间切换

    我仍在研究这个 libgdx 项目 并且正在尝试找出将屏幕更改为游戏屏幕的最佳方法 现在 当单击按钮时 我需要它转换到游戏屏幕 我已经看到了一些扩展游戏类的实现 但我不确定这里最好的方法是什么 这是主要的应用程序类 public class
  • Bootstrap 模式表单提交后不会关闭

    我需要做的是显示一个弹出窗口 向我的数据库添加一条新记录 我使用 bootstrap 3 我喜欢它 因为我没有使用一行 jquery 而且我有非常好的形式 显然它们是基于 jquery 我正在通过 ajax 验证我的表单 但现在的问题是我的
  • 为什么 .NET 中不检查异常?

    我知道谷歌搜索我可以找到合适的答案 但我更喜欢听听您的个人 也许是技术 意见 Java 和 C 在抛出异常方面存在差异的主要原因是什么 在 Java 中 抛出异常的方法的签名必须使用 throws 关键字 而在 C 中 您不知道在编译时是否
  • MySQL 选择 JOIN 3 个表

    我有三个基本表 tblUsers usrID usrFirst usrLast 1 John Smith 2 Bill Jones 3 Jane Johnson pm data id date sent title sender id th
  • WPF 日历:粗体指定日期?

    我正在创建一个窗口 该窗口使用 WPF 日历来浏览在所示月份的指定日期创建的文档 当日历更改月份时 我会在数据库中搜索该月创建的所有文档 并用它来创建该月内包含文档的日期列表 在日历控件中 我想将包含文档的日期加粗 就像 Outlook 将
  • 在 3D 中拟合直线

    是否有任何算法可以从一组 3D 数据点返回直线方程 我可以找到大量的资料来给出 2D 数据集中的直线方程 但没有一个是 3D 的 如果您试图从其他两个值中预测一个值 那么您应该使用lstsq与a参数作为自变量 加上一列 1 来估计截距 和b
  • 加快从 pyodbc 插入 SQL Server 的速度

    In python 我有一个从一个数据库中选择数据的过程 Redshift via psycopg2 然后将该数据插入到SQL Server via pyodbc 我选择执行读 写而不是读 平面文件 加载 因为行数约为每天 100 000