使用sqlalchemy加速Sybase中临时表的插入

2024-04-26 14:44:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在插入sybase temp表时,我的性能非常差—仅1000行的时间为10秒。1000行需要46秒,10000行需要几分钟。我将有大约10万行。 有没有办法加快插入速度?是否Sybase中的临时表配置不正确?如果是,我需要向DBA询问有关配置的什么问题

Code :
    engine = get_connection(db_constants.DB_RISK)
    data = []
    for i in range(1, 1000, 1):
        values = ['AL' + str(i)]
        data.append(values)
    with engine.connect() as conn:
        conn.execute("CREATE TABLE " + tmp_table_name + "(alias_id varchar(255));")
        start = time.time()
        for i in range(0, len(data), 1000):
            loop_start = time.time()
            with conn.begin():
                stmt = "INSERT INTO #TMP (alias_id) VALUES (?)"
                conn.execute(stmt, data[i:i + 1000])
            loop_end = time.time()
            print("batch " + str(i) + " time elapsed : " + str(loop_end - loop_start))
        end = time.time()
        print("total time elapsed : " + str(end - start))

Tags: inloopforexecutedatatimewithrange
1条回答
网友
1楼 · 发布于 2024-04-26 14:44:26

假设这是Sybase ASE。。。不知道故障排除和P&;到目前为止,OP已经执行了。。。一些意见、评论和建议:

注意:其中大部分(全部?)将适用于任何生成中等到高容量DB写入活动的程序

延迟在哪里?

让DBA在运行进程时监视等待事件;等待事件应该能够提供延迟发生在何处的详细信息。。。在解析/编译期间?爱娥等待?数据服务器正在等待客户端(即,网络和/或客户端/应用程序延迟?)

语句缓存

优化器必须解析并可能编译这些INSERT语句中的每一条

如果这是ASE 15+并且正在编译每个插入,则这可能需要很长时间。在这种情况下,通常最好确保已将数据服务器配置为支持语句缓存(以禁用语句#2到#N的编译阶段)

为语句缓存配置数据服务器意味着1)为“语句缓存大小”分配一些内存,2)将“启用文字自动参数”设置为1

批处理DML语句

每个完成的事务都需要将已更改的日志记录刷新到磁盘,然后才能将事务视为“完成”。通过将多个写入命令(如INSERT)分组到一个事务中,可以减少(日志)写入磁盘的次数,这将导致日志写入延迟,直到发出“提交事务”

虽然ASE 15+应该延迟tempdb活动的日志写入,但将单个DML语句分组到事务中通常是一种好的做法

(对我来说)不清楚您是否在使用任何类型的事务管理,因此我建议实现一些事务管理,例如,将内部循环包装在“begin-tran”和“commit-tran”对中

外部输出可能较慢

任何产生输出的程序。。。要么到控制台,要么到文件。。。通常,由于生成所述输出,性能会有所下降(如果输出到“慢速”磁盘上的文件,情况会更糟)。由于操作系统必须不断地重新绘制控制台(将所有行向上移动一行,在底部添加新行,重复),因此即使将大量输出转储到控制台也会大大降低速度

如果我正确地阅读了您的代码,那么在每次插入之后都会生成一个print语句;所以我们说的是10万条语句,是吗?大量IO请求被发送到文件或控制台

我希望在启用和不启用print语句(插入后)的情况下运行一些计时测试,以查看这是否会(显著)增加总体运行时间

注意:我知道,我知道,我知道。。。这听起来有点傻,但是。。。我已经看到一些进程仅仅通过限制/禁用控制台窗口的输出就加快了1-2倍。试着在没有插入和打印的情况下运行你的程序。。。在控制台上滚动100K行需要多长时间?将100K行打印到输出/日志文件需要多长时间

批量插入

与批量加载功能相比,单个插入总是相对较慢。ASE具有(相对)快速批量数据加载的内置功能。在操作系统级别,有“bcp”程序。对于编程语言(例如python?),关联的(Sybase/ASE)库应该有一个大容量插入/复制模块

<>我想调查一下你的Python/Sybase /ASILB对于某种类型的大容量加载模块,然后考虑使用它来执行100K的插入。p>

相关问题 更多 >