DuckDB虽然是一个分析型数据库,它也支持DML操作,但这个操作也最好是批量的,如果用循环来执行,效率很低,那么到底效率有多低,用实验来说明。
代码如下:
import duckdb
import time
methods=['字符串拼接','绑定变量循环','绑定变量批量']
trans=['自动提交','事务']
def f(method,n,con,tran):
con.execute("truncate table t")
lis=[[i] for i in range(n)]
if tran==1:con.execute("begin transaction")
t=time.time();
if method==0:
for i in range(n):con.execute("insert into t select "+str(i))
elif method==1:
for i in range(n):con.execute("insert into t values (?)", [i])
elif method==2:
con.executemany("insert into t values (?)", lis)
if tran==1:con.execute("commit")
print(trans[tran]," ",methods[method],":",round(time.time()-t,2),"s")
n=10000
#字符串拼接
con = duckdb.connect(database = ":memory:")
con.execute("create table t(a int)")
for m in range(3):
for t in range(2):
f(m,n,con,t)
t=time.time();con.execute("insert into t select i from range("+str(n)+")t(i)");print("利用SQL语句本身批量:",round(time.time()-t,2),"s")
输出如下
自动提交 字符串拼接 : 5.01 s
事务 字符串拼接 : 3.82 s
自动提交 绑定变量循环 : 5.79 s
事务 绑定变量循环 : 4.59 s
自动提交 绑定变量批量 : 2.42 s
事务 绑定变量批量 : 1.23 s
利用SQL语句本身批量: 0.0 s
看来各种涉及变量的方法差距不大,而与SQL本身的批量比,差距太大

9999

被折叠的 条评论
为什么被折叠?



