python批量插入到达梦数据库的三种方式性能对比

最近工作中,遇到需要批量导入测试数据到达梦数据库表中。使用python程序,完成一定规模数据插入到达梦数据库表中,尝试了三种方式(for循环单条,批量插入,分批批量插入),对三种数据插入方案,进行了一次性能测试比对,记录一下测试心得

环境

Win11+python

虚拟机centos7+DM8数据库

编写python数据导入程序

编写以下python程序,分别实现for循环单条插入,批量插入,分批批量插入数据到DM8达梦数据库,数据量插入4万条,再分别统计三种方式的用时。

#创建一个数据库连接

import dmPython

import time

conn = dmPython.connect(user='SYSDBA', password='SYSDBA', server='192.168.31.112', port=5236, autoCommit=True)

cursor  = conn.cursor()

cursor.execute("select sysdate()")

res = cursor.fetchall()

print(res)

# 创建测试表

cursor.execute('CREATE TABLE IF NOT EXISTS test1 (id INTEGER PRIMARY KEY, value varchar)')

#清空表,表可能存在,初始化测试环境

cursor.execute ('TRUNCATE table test1')

conn.commit()

print('python: 清空 success!')

######### for 循环,单条插入性能测试########

# 统计总时间

start_time = time.time()

#插入数据

for i in range(1,40001):

 cursor.execute ('INSERT INTO test1 (id, value) values (?, ?)',(i,f'Value{i}'))

 conn.commit()

# 打印总时间

end_time = time.time()

total_time = end_time - start_time

print(f'for 循环,单条插入,Total time: {total_time} seconds')

print('打印插入数据量')

cursor.execute ("  select COUNT(*) from test1")

res = cursor.fetchall()

print(res)

print('python: Single insert table success!')

#########批量插入性能测试########

 #清空表,初始化测试环境

cursor.execute ('TRUNCATE table test1')

conn.commit()

print('python: 清空 success!')

# 准备要插入的数据

data = [(i, f'Value{i}') for i in range(1,40001)]

# 统计总时间

start_time = time.time()

#插入数据

cursor.executemany ('INSERT INTO test1 (id, value) values (?, ?)',data)

conn.commit()

# 打印总时间

end_time = time.time()

total_time = end_time - start_time

print(f'批量插入,Total time: {total_time} seconds')

print('打印插入数据量')

cursor.execute ('select COUNT(*) from test1')

res = cursor.fetchall()

print(res)

print('python: Batch insert table success!')

#########分批批量插入性能测试########

 #清空表,初始化测试环境

cursor.execute ('TRUNCATE table test1')

conn.commit()

print('python: 清空 success!')

data.clear()

# 统计总时间

start_time = time.time()

for i in range(1,40001):

    data.append((i,f'Value{i}'))

    if len(data) ==1000:#每批为1000条数据

        cursor.executemany ('INSERT INTO test1 (id, value) values (?, ?)',data)

        data.clear()

conn.commit()

# 打印总时间

end_time = time.time()

total_time = end_time - start_time

print(f'分批批量,Total time: {total_time} seconds')

print('打印插入数据量')

cursor.execute ('select COUNT(*) from test1')

res = cursor.fetchall()

print(res)

print('python: batched batch insert table success!')

conn.close()

测试过程

执行程序:

结果显示:

分析总结

测试结果显示:for循环单次插入性能最低效,而分批批量插入,比单次批量插入的性能更高。

分批批量插入性能高于单次批量插入的性能,与我预期不符,查阅达梦数据库相关资料,大概理解了其中原因:

分批插入将大量数据分成小批次进行插入,可以减少数据库的压力,提高插入性能。

分批插入性能高的几个点

1. 可以降低数据库IO:一次插入大量数据时,数据库需要处理大量数据,可能导致IO瓶颈。分批插入可以将数据分成小批次,降低每次插入的数据量,从而降低数据库IO。

2. 可以减少锁竞争:在并发访问的情况下,大量数据同时插入可能导致锁竞争,影响数据库性能。分批插入可以降低锁竞争,提高数据库并发性能。

3. 可以提高插入速度:分批插入可以充分利用数据库的批量处理能力,提高数据插入速度。

达梦技术社区:eco.dameng.com

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值