====================
== Hi, I'm Vimiix ==
====================
Get hands dirty.

psycopg2基于openGauss中execPramasBatch和execPreparedBatch接口测试

driver psycopg2 benchmark

如果要查看 Psycopg2 不同接口之间批量操作对比测试,请访问这篇笔记

测试环境

组件说明
客户端操作系统Rocky Linux 8
服务端配置2C6G, 40G HDD
CPUIntel Xeon Processor (Icelake)
数据库MogDB 5.0
网络300M宽带
Python3.6.8
Psycopg2vimiix/openGauss-connector-python-psycopg2

注意:

  1. 由于真正的性能和服务器的配置,网络情况相关性也比较大,本测试所有的测试用例环境条件一致,只有参数作为变量,所以请不要注重数值本身,重点关注不同情况下的性能比例
  2. 本测试只取了 100/1000/10000 这个page_size,具有一定的性能趋势,但不代表一味的增大 page_size 就可以提高性能,必然存在一个性能拐点的参数值,而且不同的场景存在不同的性能拐点,要找到性能拐点仍需根据实际情况进行更多的测试。

插入 INSERT

execute_values

rows\page_size100(default)100010000
10,0002089349204
50,000108421801707
100,0002144536251257

image.png

execute_params_batch

rows\page_size100(default)100010000
10,0002243504312
50,0001157425911539
100,0002255255112980

image.png

execute_prepared_batch

rows\page_size100(default)100010000
10,0002328506339
50,0001130728361480
100,0002297659203425

image.png

相同行数时,不同 page_size 的接口性能对比

image.png
image.png

更新 UPDATE

execute_values

用法比较饶,需要把 values 的部分单独用一个 %s 占位

rows\page_size100(default)100010000
10,0003884562393
50,0001536734292601
100,00025882113135356

image.png

execute_params_batch

rows\page_size100(default)100010000
10,0002746810579
50,0001335944783026
100,0002843285295923

image.png

execute_prepared_batch

rows\page_size100(default)100010000
10,0002747896635
50,0001286061533626
100,000284451010310828

image.png

相同行数时,不同 page_size 的接口性能对比

image.png
image.png

结论

  1. 任何接口,在对于大批量操作时,调大 page_size 均可以得到有效的性能提升
  2. 从数据来看, execute_values 的性能不管在INSERT还是UPDATE的表现,都稍稍好于 execute_params_batch 和 execute_prepared_batch(由于测试的局限性,可能也不一定)。execute_params_batch 和 execute_prepared_batch 两个接口性能差别不大,底层走的是一套接口。
  3. 从使用上来说,execute_values 使用比较饶,如果要使用这个接口更新,写SQL的复杂度大于其他两个,比如相同的更新操作:
    • execute_values: UPDATE t3 as t SET j = data.j FROM (VALUES %s) AS data (j, i) WHERE t.i = data.i
    • 其他两个:UPDATE t3 SET j=$1 WHERE t3.i=$2