python讀取oracle數據庫性能_用python對oracle進行簡單性能測試

一、概述

dba在工作中避不開的兩個問題,sql使用綁定變量到底會有多少的性能提升?數據庫的審計功能如果打開對數據庫的性能會產生多大的影響?最近恰好都碰到了,索性做個實驗。

sql使用綁定變量對性能的影響

開通數據庫審計功能對性能的影響

實驗采用的辦法很簡單,就是通過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表空間!

五、總結

代碼中盡量使用綁定變量

最好不要開通數據庫的審計,可以通過堡壘機去實現對用戶操作審計(ps:還請大家推薦個堡壘機廠商,這個才是本文最主要的目的_)

實驗存在不嚴謹的地方,相關對比數據也僅作為參考

以上就是用python對oracle進行簡單性能測試的示例的詳細內容,更多關于python 對Oracle進行性能測試的資料請關注其它相關文章!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ 3231: [Sdoi2008]遞歸數列 (JZYZOJ 1353) 矩陣快速冪

http://www.lydsy.com/JudgeOnline/problem.php?id3231和斐波那契一個道理在最后加一個求和即可1 #include<cstdio>2 #include<cstring>3 #include<iostream>4 //using namespace std;5 const int maxn10010;6 const double eps1e-8;7 long long modn;8 lon…

馬斯克的火箭上天了,SpaceX開源項目也登上了熱榜!

python知識手冊SpaceX于美國東部時間5月30日下午3&#xff1a;22分將兩位美國宇航員送往國際空間站&#xff0c;雖然這只是Demo任務&#xff0c;但SpaceX已經以其卓越工程優勢、低廉的發射成本贏得了全球航天產業的信賴。同時也是除美俄中這些航天國家隊以外&#xff0c;唯一獨…

EasyMock學習筆記

目前在接觸平臺側的開發&#xff0c;發現平臺側的東西和以前javacard開發很不一樣&#xff0c;看來以后要學的東西還有很多很多。今天接觸了下EasyMock。 Mock 方法是單元測試中常見的一種技術&#xff0c;它的主要作用是模擬一些在應用中不容易構造或者比較復雜的對象&#xf…

app啟動廣告頁的實現,解決了廣告圖片要實時更新的問題

網上很多的實現方法很多都是顯示第一次的緩存的圖片&#xff0c;這樣就造成后臺更新廣告圖片App不能實時展示的問題。 我的具體實現思路是&#xff1a; 1.啟動時先獲取啟動頁的圖片全屏展示。 2.設計一個等待時間&#xff0c;如果超過等待時間還沒拿到圖片就把獲取的啟動頁去掉…

vue中點擊插入html_Vue中插入HTML代碼的方法

我們需要吧Hello World插入到My name is Pjee應該如何做&#xff1f;一、使用v-htmlv-html:更新元素的 innerHTMLconst text Hello World>My name is Pjee注意&#xff1a;你的站點上動態渲染的任意 HTML 可能會非常危險&#xff0c;因為它很容易導致 XSS 攻擊。請只對可信…

進程共享變量#pragma data_seg用法

#pragma data_seg介紹用#pragma data_seg建立一個新的數據段并定義共享數據&#xff0c;其具體格式為&#xff1a;   #pragma data_seg &#xff08;"shareddata")   HWND sharedwndNULL;//共享數據   #pragma data_seg() ---------------------------------…

機器視覺Halcon教程(1.介紹)

前言本期教程主要教大家如何使用Halcon機器視覺&#xff0c;通過使用Halcon, 我們可以實現一些機器視覺的應用開發。例如: OCR識別、視覺定位、缺陷檢測等內容。什么是halcon&#xff1f;簡單來說, Halcon就是一款應用于機器視覺的軟件&#xff0c;它提供了一套開發工具&#x…

網絡時間的那些事及 ntpq 詳解

2019獨角獸企業重金招聘Python工程師標準>>> GMT (Greenwich Mean Time)格林威治時間 UTC (Coordinated Universal Time) 協調世界時 IAT (International Atomic Time),TAI 國際原子時 CST (Chinese Standard Time), 北京時間Gentoo&#xff08;也許其他發行版也是&…

【前端芝士樹】Javascript的原型與原型鏈

【前端芝士樹】Javascript的原型、原型鏈以及繼承機制 前端的面試中經常會遇到這個問題&#xff0c;自己也是一直似懂非懂&#xff0c;趁這個機會整理一下0. 為什么會出現原型和原型鏈的概念 1994年&#xff0c;網景公司&#xff08;Netscape&#xff09;發布了Navigator瀏覽器…

神奇的幻方2015提高組d1t1

題目描述 幻方是一種很神奇的N*N矩陣&#xff1a;它由數字1,2,3,……,N*N構成&#xff0c;且每行、每列及兩條對角線上的數字之和都相同。 當N為奇數時&#xff0c;我們可以通過以下方法構建一個幻方&#xff1a; 首先將1寫在第一行的中間。 之后&#xff0c;按如下方式從小到大…

goldengate mysql_使用GoldenGate實現MySQL到Oracle的數據實時同步

step 1: 配置mysql修改配置文件my.ini#for goldengatelog-bin "C:/mysql/logbin/logbin.log"binlog-format ROWlog-bin-index "C:\mysql\logindex"binlog_cache_size32mmax_binlog_cache_size512mmax_binlog_size512m添加數據庫用戶ggs&#xff0c;具有…

C# 反射之Activator用法舉例

概述程序運行時&#xff0c;通過反射可以得到其它程序集或者自己程序集代碼的各種信息&#xff0c;包括類、函數、變量等來實例化它們&#xff0c;執行它們&#xff0c;操作它們&#xff0c;實際上就是獲取程序在內存中的映像&#xff0c;然后基于這個映像進行各種操作。Activa…

MyBatis批量插入

轉載于:https://blog.51cto.com/12701034/1929672

狐貍文│區塊鏈發展的正路

&#xff08;圖片出自網絡&#xff0c;版權歸原作者所有&#xff09;最近看了一本書&#xff1a;《美國增長的起落》。這本書是大部頭&#xff0c;但看起來很過癮。通過對這本書的閱讀&#xff0c;我更新了自己對區塊鏈發展的理解。這一年&#xff0c;“區塊鏈”很熱&#xff0…

mysql 一主一備_Mysql一個主一備

Mysql主從復制 -- 一主一備主從復制原理&#xff1a;Mysql的主從復制是mysql本身自帶的一個功能&#xff0c;不需要額外的第三方軟件可以實現&#xff0c;其復制功能并不是copy文件實現的&#xff0c;而是借助binlog日志文件里面的SQL命令實現的主從復制&#xff0c;可以理解為…

解決安裝Weblogic domain卡住問題(Primeton BPS)

這兩天一直有一個問題困擾我&#xff0c;在suse10weblogic(920,923,100,103)上安裝bpm產品失敗。有些版本是創建domain的時候卡在create security information上&#xff0c;有些版本卡在安裝包start weblogic上。但是在winXPweblogic10.3bpm安裝成功。 經過幾番GOOGLE,終于找到…

cocos2d-js 熱更新具體解釋(一)

本文將會具體解說cocos2d-js下的熱更新機制。這篇內容先給大家介紹一下兩個manifest文件就當熱身了。首先介紹project.manifest&#xff1a; 舉個樣例 {"packageUrl" : "http://192.168.1.108/games/dragon_gold","remoteManifestUrl" : "…

Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)

簡述 QBoxLayout可以在水平方向或垂直方向上排列控件&#xff0c;由QHBoxLayout、QVBoxLayout所繼承。 QHBoxLayout&#xff1a;水平布局&#xff0c;在水平方向上排列控件&#xff0c;即&#xff1a;左右排列。 QVBoxLayout&#xff1a;垂直布局&#xff0c;在垂直方向上排列控…

Optaplanner終于支持多線程并行運行 - Multithreaded incremental solving

Optaplanner 7.9.0.Final之前&#xff0c;啟動引擎開始對一個Problem進行規劃的時候&#xff0c;只能是單線程進行的。也就是說&#xff0c;當引擎對每一個possible solution進行分數計算的過程中&#xff0c;細化到每個步驟(Caculation)&#xff0c;都只能排隊在同一個線程中依…

python棋盤格_干貨必看 | Python的turtle庫之經典棋盤格

國際棋盤格是一個由9橫9縱的線組成的格子正方形&#xff0c;用Python的turtle庫進行繪制的時候&#xff0c;先做9橫9縱的線&#xff0c;再填上灰色小正方形&#xff0c;這就可以完成一個棋盤格了&#xff0c;下面是具體的操作步驟。(一)整體代碼1、import turtleimport turtle2…