用python对oracle进行简单性能测试
一、概述
dba在工作中避不开的两个问题,sql使用绑定变量到底会有多少的性能提升?数据库的审计功能如果打开对数据库的性能会产生多大的影响?最近恰好都碰到了,索性做个实验。
- sql使用绑定变量对性能的影响
- 开通数据库审计功能对性能的影响
实验采用的办法很简单,就是通过python读取csv文件,然后将其导入到数据库中,最后统计程序执行完成所需要的时间
二、准备脚本
python脚本dataimporttest.py
#author:yangbao #function:通过导入csv,测试数据库性能 importcx_Oracle importtime #数据库连接串 DATABASE_URL='user/password@ip:1521/servicename' classCsvDataImport: def__init__(self,use_bind): self.csv_name='test.csv' self.use_bind=use_bind ifuse_bind==1: self.insert_sql="insertintotesttbvalues(:0,"\ "to_date(:1,'yyyy-mm-ddhh24:mi:ss'),"\ "to_date(:2,'yyyy-mm-ddhh24:mi:ss'),"\ ":3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,"\ ":15,:16,:17,:18,:19,:20,:21)"#使用绑定变量的sql else: self.insert_sql="insertintotesttbvalues({0},"\ "to_date('{1}','yyyy-mm-ddhh24:mi:ss'),"\ "to_date('{2}','yyyy-mm-ddhh24:mi:ss'),"\ "{3},{4},'{5}',{6},'{7}',{8},{9},{10},{11},{12},{13},{14},"\ "{15},{16},{17},{18},{19},{20},{21})"#不使用绑定变量的sql defdata_import(self): begin_time=time.perf_counter() try: conn=cx_Oracle.connect(DATABASE_URL) curs=conn.cursor() withopen(self.csv_name)asf: csv_contents=f.readlines() import_rows=0 message='{}starttoimport'.format(self.csv_name) print(message) forline,csv_contentinenumerate(csv_contents[1:]): data=csv_content.split(',') ifself.use_bind==1: data=map(lambdax:Noneifx==''elsex,data) else: data=map(lambdax:'null'ifx==''elsex,data) data=list(data) data[-1]=data[-1].replace('\n','') ifself.use_bind==1: curs.execute(self.insert_sql,data)#使用绑定变量的方式插入数据 else: #print(self.insert_sql.format(*data)) curs.execute(self.insert_sql.format(*data))#使用非绑定变量的方式插入数据 import_rows+=1 ifimport_rows%10000==0: curs.execute('commit') message='{}hasimported{}lines'.format(self.csv_name,import_rows) print(message) conn.commit() curs.close() conn.close() end_time=time.perf_counter() elapsed=round(end_time-begin_time,2) message='{},importrows:{},use_bind:{},elapsed:{}'.format( self.csv_name,import_rows,self.use_bind,elapsed) print(message) exceptExceptionase: message='{}importfailed,reason:{}'.format(self.csv_name,str(e)) print(message) if__name__=='__main__': CsvDataImport(use_bind=1).data_import()
csv文件
test.csv(内容略)
三、测试sql使用绑定变量对性能的影响
a.使用绑定变量
对库进行重启,目的是清空数据库内的所有缓存,避免对实验结果产生干扰
SQL>startupforce; SQL>droptableyang.testtbpurge; SQL>createtableyang.testtbasselect*fromyang.testwhere1=0;
运行脚本pythondataimporttest.py
结果:test.csv,importrows:227795,use_bind:1,elapsed:260.31
b.不使用绑定变量
对库进行重启
SQL>startupforce; SQL>droptableyang.testtbpurge; SQL>createtableyang.testtbasselect*fromyang.testwhere1=0;
将脚本的最后一行CsvDataImport(use_bind=1).data_import()改为CsvDataImport(use_bind=0).data_import()
运行脚本pythondataimporttest.py
结果:test.csv,importrows:227795,use_bind:0,elapsed:662.82
可以看到同样的条件下,程序运行的时间,不使用绑定变量是使用绑定变量的2.54倍
四、测试数据库开启审计功能对性能的影响
查看数据库审计功能是否开启
SQL>showparameteraudit NAMETYPEVALUE ----------------------------------- audit_trailstringNONE
统计sys.aud$这张表的行数
SQL>selectcount(*)fromsys.aud$; COUNT(*) ---------- 0
所以可以直接拿第三步中的(a.使用绑定变量)的结果作为没开通审计功能程序运行的时间
对库开通审计功能,并进行重启
SQL>altersystemsetaudit_trail=db,extendedscope=spfile;#如果设置成db,那么在sys.aud$里面sqltext将为空,也就是说看不到用户执行的sql语句,审计毫无意义 SQL>startupforce; SQL>droptableyang.testtbpurge; SQL>createtableyang.testtbasselect*fromyang.testwhere1=0; SQL>auditinserttablebyyang;#开通对用户yang的insert操作审计
将脚本的最后一行CsvDataImport(use_bind=0).data_import()改为CsvDataImport(use_bind=1).data_import()
运行脚本pythondataimporttest.py
结果:test.csv,importrows:227795,use_bind:1,elapsed:604.23
与前面使用绑定变量但没有开通数据库审计功能,程序运行的时间,开通数据库审计功能是不开通数据库审计功能的2.32倍
再来看看sys.aud$这张表的大小
SQL>selectcount(*)fromsys.aud$; COUNT(*) ---------- 227798
因sys.aud$这张表中的sqltext与sqlbind都是clob字段,因此需要通过下面的sql去统计该表所占用的空间
SQL>selectsum(bytes)fromdba_extentswheresegment_namein( selectdistinctnamefrom(selecttable_name,segment_namefromdba_lobswheretable_name='AUD$') unpivot(nameforiin(table_name,segment_name))); SUM(BYTES) ---------- 369229824
查看testtb这张表占用的空间
SQL>selectsum(bytes)fromdba_extentswheresegment_namein('TESTTB'); SUM(BYTES) ---------- 37748736
可以看到对一个22万行的csv数据导入到数据库,审计的表占用的空间就达到了惊人的360M,而testtb这张表本身也才37M而已
通过上面的实验可以得出,对于数据库的审计功能,开通后会严重拖慢数据库的性能以及消耗system表空间!
五、总结
- 代码中尽量使用绑定变量
- 最好不要开通数据库的审计,可以通过堡垒机去实现对用户操作审计(ps:还请大家推荐个堡垒机厂商,这个才是本文最主要的目的_)
实验存在不严谨的地方,相关对比数据也仅作为参考
以上就是用python对oracle进行简单性能测试的示例的详细内容,更多关于python对Oracle进行性能测试的资料请关注毛票票其它相关文章!