墨墨导读:SQL中使用绑定变量,以及开通审计功能对数据库影响有多大?本文来自读者投稿,作者用Python进行了一番测试,欢迎评论区交流互动。

一、概述

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

  1. sql使用绑定变量对性能的影响

  2. 开通数据库审计功能对性能的影响

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

二、准备脚本

python脚本dataimporttest.py

# author: yangbao# function: 通过导入csv,测试数据库性能
import cx_Oracleimport 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})"  # 不使用绑定变量的sqldef 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 = 0message = '{} 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 auditNAME           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. 最好不要开通数据库的审计,可以通过堡垒机去实现对用户操作审计

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

墨天轮原文链接:https://www.modb.pro/dB/25243(复制到浏览器中打开或者点击“阅读原文”)

推荐阅读:144页!分享珍藏已久的数据库技术年刊

数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

Oracle绑定变量和审计功能影响性能吗?Python告诉你相关推荐

  1. Oracle 绑定变量 详解 .

    之前整理过一篇有关绑定变量的文章,不太详细,重新补充一下. Oracle 绑定变量 http://blog.csdn.net/tianlesoftware/archive/2009/10/17/467 ...

  2. linux 审计oracle,开启和关闭oracle数据库中的审计功能

    开启和关闭oracle数据库中的审计功能 第1步:查看审计功能是否开启? SQL> show parameter audit; NAME           TYPE         VALUE ...

  3. oracle绑定变量写法,关于Oracle绑定变量的个人理解及使用场景

    关于Oracle绑定变量 摘自--Oracle 11g concept 中英文对照版 使用了绑定变量能提高性能主要是因为这样做可以尽量避免不必要的硬解析而节约了时间,同时节约了大量的CPU资源. 绑定 ...

  4. java绑定变量怎么加_在JAVA 源程序中编写SQL语句时使用ORACLE 绑定变量

    在JAVA中的SQL 语句的编写方面,没有使用ORACLE 绑定变量,很大程度上降低了数据库的性能,表现在两个方面: 1.SQL语句硬分析(Hard Parse)太多,严重消耗CPU资源,延长了SQL ...

  5. Oracle绑定变量分级(Bind Graduation)

    Oracle绑定变量分级(Bind Graduation) 绑定变量分级(Bind Graduation)是指Oracle在PL/SQL代码中会根据文本型绑定变量的定义长度而将这些文本型绑定变量分为四 ...

  6. oracle绑定变量执行计划,绑定变量对执行计划的影响

    发现无论启动或者关闭绑定变量窥探使用绑定变量的SQL都有可能选择错误的执行计划,当第一次硬解析产生执行计划时,之后的绑定变量SQL就会继续这个执行计划执行,有时可能是错的.如何改进呢? 1.当关闭绑定 ...

  7. 解决oracle绑定变量重复,基于ORACLE SQL优化之绑定变量(4)

    绑定变量的使用过程当中,oracle建议绑定变量的个数不宜太多.目标SQL的SQL文本中的绑定变量个数不宜太多,否则可能会导致目标SQL总的执行时间大幅度的增长.增长的时间主要消耗在执行目标SQL时对 ...

  8. oracle变量绑定代码,Oracle 绑定变量

    oracle 中,对于一个提交的sql语句,存在两种可选的解析过程,一种叫做硬解析,一种叫做软解析.https://www.cndba.cn/Dave/article/1275 一个硬解析需要经解析, ...

  9. ORACLE 绑定变量用法总结

    http://blog.csdn.net/wh62592855/article/details/4778343 之前对ORACLE中的变量一直没个太清楚的认识,比如说使用:.&.&&a ...

最新文章

  1. java集合类讲解视频,关于java:实实在在面试List和Map集合面试合集含讲解视频
  2. Nvidia、Intel、AMD技术人员薪资大揭秘:平均薪酬超20万$,英伟达最高近35万美元...
  3. python 安装第三方包
  4. js只能输入数字[价格等]
  5. 条件变量为什么要和互斥锁一起使用
  6. 如何解决MySQL中的死锁问题?
  7. 常数时间插入、删除和获取随机元素
  8. [模板] tarjan/联通分量/dfs树
  9. Mac硬件温度管理软件TG Pro
  10. PostgreSQL快速入门
  11. 项目管理(二)责任划分
  12. python网络蜘蛛
  13. ubuntu实用工具
  14. linux脚本看日历,Linux查看日历之cal命令
  15. synchronizedReentrantLock乐观锁悲观锁(Java线程安全实现)JVM9
  16. 家庭居室装修需做哪些项目
  17. C++-计算体质指数BMI值 信息学奥赛
  18. 金融业务-美港股和A股的区别
  19. 一款10秒钟完成的校园报修系统【分享】
  20. 有道 linux 安装路径,「Linux」- 安装有道词典

热门文章

  1. 为什么我爱Xonsh
  2. 正确绑定键盘事件_事件为何重要以及如何正确处理
  3. (1)HTML5概述
  4. js的prototype属性
  5. HTML 表格的基本布局
  6. sperling指标 matlab,sperling指标计算实验报告
  7. 关于计算机人工智能的知识,《计算机科学导论》人工智能基础知识
  8. plsql连mysql数据库12541_启动plSql时候报ORA-12541:TNS:tns:无法解析指定的连接标识符的解决办法(org11)...
  9. HDC2020开发者大会鸿蒙,华为开发者大会HDC 2020将于9月10日开启 鸿蒙OS 2.0亮相
  10. 逆向课程第二讲,寻找main入口点