用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进行性能测试的资料请关注毛票票其它相关文章!