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

作者:小豹子的网络记事本 时间:2021-07-08 16:51:59 

一、概述

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:还请大家推荐个堡垒机厂商,这个才是本文最主要的目的_)

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

来源:https://www.cnblogs.com/ddzj01/p/12919067.html

标签:python,性能,测试,Oracle
0
投稿

猜你喜欢

  • 上传图片js判断图片尺寸和格式兼容IE

    2024-04-10 10:48:37
  • 如何批量生成MySQL不重复手机号大表实例代码

    2024-01-23 13:41:02
  • Python参数类型以及常见的坑详解

    2023-04-16 13:52:33
  • npm一键安装Python以及node-sass依赖环境的方法

    2024-05-05 09:21:40
  • 纯CSS Tooltips提示

    2008-10-18 16:01:00
  • vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)

    2024-05-22 10:28:19
  • 亚马逊购物用户体验分析(三)

    2009-10-25 12:53:00
  • Python开发的HTTP库requests详解

    2021-09-06 19:08:09
  • Python简单实现自动删除目录下空文件夹的方法

    2021-07-28 20:28:39
  • Pytest测试框架基本使用方法详解

    2022-06-23 20:49:04
  • asp中文URL编码server.urlencode

    2008-08-08 11:22:00
  • Smush it - 一款图片压缩的Firefox插件,很好,很强大!

    2009-04-12 20:09:00
  • 详细分析Python可变对象和不可变对象

    2021-03-10 22:50:10
  • Tensorflow的可视化工具Tensorboard的初步使用详解

    2021-06-12 18:32:06
  • windows下MySQL数据库移动到其它盘

    2024-01-21 01:08:32
  • Jquery多选下拉列表插件jquery multiselect功能介绍及使用

    2024-04-22 12:59:41
  • Python编程调用百度API实现地理位置经纬度坐标转换示例

    2023-12-30 11:44:38
  • Python中Timedelta转换为Int或Float方式

    2021-01-24 19:46:41
  • 利用Python破解生日悖论问题

    2022-11-08 02:37:55
  • python调用kubernetesAPI简单使用方法

    2021-05-09 23:25:21
  • asp之家 网络编程 m.aspxhome.com