用python对oracle进行简单性能测试


Posted in Python onDecember 05, 2020

一、概述

dba在工作中避不开的两个问题,sql使用绑定变量到底会有多少的性能提升?数据库的审计功能如果打开对数据库的性能会产生多大的影响?最近恰好都碰到了,索性做个实验。

  1. sql使用绑定变量对性能的影响
  2. 开通数据库审计功能对性能的影响

实验采用的办法很简单,就是通过python读取csv文件,然后将其导入到数据库中,最后统计程序执行完成所需要的时间

二、准备脚本

python脚本dataimporttest.py

# author: yangbao
# function: 通过导入csv,测试数据库性能

import cx_Oracle
import time


# 数据库连接串
DATABASE_URL = 'user/password@ip:1521/servicename'


class CsvDataImport:

 def __init__(self, use_bind):
  self.csv_name = 'test.csv'
  self.use_bind = use_bind
  if use_bind == 1:
   self.insert_sql = "insert into testtb values(:0, " \
        "to_date(:1,'yyyy-mm-dd hh24:mi:ss'), " \
        "to_date(:2,'yyyy-mm-dd hh24: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 = "insert into testtb values({0}, " \
        "to_date('{1}','yyyy-mm-dd hh24:mi:ss'), " \
        "to_date('{2}','yyyy-mm-dd hh24:mi:ss'), " \
        "{3}, {4}, '{5}', {6}, '{7}', {8}, {9}, {10}, {11}, {12}, {13}, {14}, " \
        "{15}, {16}, {17}, {18}, {19}, {20}, {21})" # 不使用绑定变量的sql

 def data_import(self):

   begin_time = time.perf_counter()

   try:
    conn = cx_Oracle.connect(DATABASE_URL)
    curs = conn.cursor()

    with open(self.csv_name) as f:
     csv_contents = f.readlines()

    import_rows = 0

    message = '{} start to import'.format(self.csv_name)
    print(message)

    for line, csv_content in enumerate(csv_contents[1:]):

     data = csv_content.split(',')
     if self.use_bind == 1:
      data = map(lambda x: None if x == '' else x, data)
     else:
      data = map(lambda x: 'null' if x == '' else x, data)
     data = list(data)
     data[-1] = data[-1].replace('\n', '')

     if self.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
     if import_rows % 10000 == 0:
      curs.execute('commit')
      message = '{} has imported {} 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 = '{}, import rows: {}, use_bind: {}, elapsed: {}'.format(
     self.csv_name, import_rows, self.use_bind, elapsed)
    print(message)

   except Exception as e:
    message = '{} import failed, reason: {}'.format(self.csv_name, str(e))
    print(message)


if __name__ == '__main__':
 CsvDataImport(use_bind=1).data_import()

csv文件
test.csv(内容略)

三、测试sql使用绑定变量对性能的影响
a. 使用绑定变量
对库进行重启,目的是清空数据库内的所有缓存,避免对实验结果产生干扰

SQL> startup force;
SQL> drop table yang.testtb purge;
SQL> create table yang.testtb as select * from yang.test where 1=0;

运行脚本python dataimporttest.py

结果:test.csv, import rows: 227795, use_bind: 1, elapsed: 260.31

b. 不使用绑定变量
对库进行重启

SQL> startup force;
SQL> drop table yang.testtb purge;
SQL> create table yang.testtb as select * from yang.test where 1=0;

将脚本的最后一行CsvDataImport(use_bind=1).data_import()改为CsvDataImport(use_bind=0).data_import()

运行脚本python dataimporttest.py

结果:test.csv, import rows: 227795, use_bind: 0, elapsed: 662.82

可以看到同样的条件下,程序运行的时间,不使用绑定变量是使用绑定变量的2.54倍

四、测试数据库开启审计功能对性能的影响
查看数据库审计功能是否开启

SQL> show parameter audit 
NAME   TYPE  VALUE
-------------- ----------- ----------
audit_trail string  NONE

统计sys.aud$这张表的行数

SQL> select count(*) from sys.aud$;

 COUNT(*)
----------
   0

所以可以直接拿第三步中的(a. 使用绑定变量)的结果作为没开通审计功能程序运行的时间

对库开通审计功能,并进行重启

SQL> alter system set audit_trail=db,extended scope=spfile; # 如果设置成db,那么在sys.aud$里面sqltext将为空,也就是说看不到用户执行的sql语句,审计毫无意义
SQL> startup force;
SQL> drop table yang.testtb purge;
SQL> create table yang.testtb as select * from yang.test where 1=0;
SQL> audit insert table by yang; # 开通对用户yang的insert操作审计

将脚本的最后一行CsvDataImport(use_bind=0).data_import()改为CsvDataImport(use_bind=1).data_import()

运行脚本python dataimporttest.py

结果:test.csv, import rows: 227795, use_bind: 1, elapsed: 604.23

与前面使用绑定变量但没有开通数据库审计功能,程序运行的时间,开通数据库审计功能是不开通数据库审计功能的2.32倍

再来看看sys.aud$这张表的大小

SQL> select count(*) from sys.aud$;

 COUNT(*)
----------
 227798

因sys.aud$这张表中的sqltext与sqlbind都是clob字段,因此需要通过下面的sql去统计该表所占用的空间

SQL> select sum(bytes) from dba_extents where segment_name in (
select distinct name from (select table_name, segment_name from dba_lobs where table_name='AUD$') 
unpivot(name for i in(table_name, segment_name)));

SUM(BYTES)
----------
 369229824

查看testtb这张表占用的空间

SQL> select sum(bytes) from dba_extents where segment_name in ('TESTTB');

SUM(BYTES)
----------
 37748736

可以看到对一个22万行的csv数据导入到数据库,审计的表占用的空间就达到了惊人的360M,而testtb这张表本身也才37M而已

通过上面的实验可以得出,对于数据库的审计功能,开通后会严重拖慢数据库的性能以及消耗system表空间!

五、总结

  1. 代码中尽量使用绑定变量
  2. 最好不要开通数据库的审计,可以通过堡垒机去实现对用户操作审计(ps:还请大家推荐个堡垒机厂商,这个才是本文最主要的目的_)

实验存在不严谨的地方,相关对比数据也仅作为参考

以上就是用python对oracle进行简单性能测试的示例的详细内容,更多关于python 对Oracle进行性能测试的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python+matplotlib绘制饼图散点图实例代码
Jan 20 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
python3.6数独问题的解决
Jan 21 Python
Django保护敏感信息的方法示例
May 09 Python
树莓派动作捕捉抓拍存储图像脚本
Jun 22 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
Python如何获取文件指定行的内容
May 27 Python
浅谈Python3中print函数的换行
Aug 05 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
浅谈Python响应式类库RxPy
Jun 14 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 #Python
python自动从arxiv下载paper的示例代码
Dec 05 #Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 #Python
python从ftp获取文件并下载到本地
Dec 05 #Python
python基于socket模拟实现ssh远程执行命令
Dec 05 #Python
Python实现PS滤镜中的USM锐化效果
Dec 04 #Python
python 模拟登陆github的示例
Dec 04 #Python
You might like
聊天室php&mysql(三)
2006/10/09 PHP
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
python定时关机小脚本
2018/06/20 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
python Tensor和Array对比分析
2020/01/08 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python with语句的原理与用法详解
2020/03/30 Python
Python 可视化神器Plotly详解
2020/12/26 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
教师实习自我鉴定
2013/12/18 职场文书
市场拓展计划书
2014/05/03 职场文书
金融专业求职信
2014/08/05 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书