用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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
python中常用的各种数据库操作模块和连接实例
May 29 Python
对于Python中RawString的理解介绍
Jul 07 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python基于Selenium的web自动化框架
Jul 14 Python
python多进程间通信代码实例
Sep 30 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
python正则中最短匹配实现代码
2018/01/16 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
python装饰器代替set get方法实例
2019/12/19 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
竞职演讲稿范文
2014/01/11 职场文书
公司员工离职证明书
2014/10/04 职场文书