【问题标题】:Turning fast_executemany on is even slower than when it is off开启 fast_executemany 比关闭时还要慢
【发布时间】:2021-05-05 22:27:11
【问题描述】:

使用 pyodbc,我编写了一个 Python 程序来从 Oracle 中提取数据并加载到 SQL Server 中。从 Oracle 中提取是即时的,但是有些表需要很长时间才能加载,尤其是具有许多列(超过 100 多列)的表,其中一些列的大小为 VARCHAR(4000)(我正在运行 pyodbc 的 executemany插入)。

设置 fast_executemany = True 似乎会使 INSERT 更慢。关闭时,加载 40k 行的表大约需要 3 分钟;开启后,加载相同数量的行大约需要 15 分钟。

不确定这是否意味着什么,但我确实在每次尝试期间都打开了 SQL Profiler,我发现:当它关闭时,后端正在为每个插入执行一堆“sp_prepexec”和“sp_unprepare” ;当它打开时,后端只是做了一次“sp_prepare”,然后是一堆“sp_execute”。

知道为什么 fast_executemany 没有加快 INSERT 速度,而且实际上更长吗?

【问题讨论】:

  • 您最好配置链接服务器或通过bcp 等进行批量插入

标签: python sql-server pyodbc


【解决方案1】:

更新:我能够通过限制每次插入多少行来解​​决我的问题。我将每个 INSERT 操作的批量大小设置为一次仅 1000 行,现在 40k 行的相同 INSERT 操作大约需要 40 秒,而没有设置批量大小需要 15 分钟。

我猜 fast_executemany 在执行 INSERT 之前会将所有内容都放入内存,但如果我的列大小很大并且每次操作要插入很多行,它会给内存带来很多负担,因此会变得更慢(?)。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 2010-10-14
    • 2012-02-20
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    相关资源
    最近更新 更多