用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 相关文章推荐
新手常见6种的python报错及解决方法
Mar 09 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
详解python中init方法和随机数方法
Mar 13 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
了解一下python内建模块collections
Sep 07 Python
python Paramiko使用示例
Sep 21 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类
2006/10/09 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
Jquery中对数组的操作代码
2011/08/12 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
webpack 模块热替换原理
2018/04/09 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
JS随机密码生成算法
2019/09/23 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
python分割文件的常用方法
2014/11/01 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
python删除某个字符
2018/03/19 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
上海某公司.net方向笔试题
2014/09/14 面试题
美发店5.1活动方案
2014/01/24 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书