Python學習之十八_獲取神通數據庫所有的表數據量
背景
今天想獲取一下所有數據庫的表信息.但是發現神通數據庫的系統表裏面的表信息不正確
無法獲取實際意義的表信息.
聯繫了下神通數據庫的原廠高手. 給了一個存儲過程可以進行相關的處理.
因爲最近學習python(放下一週就忘記的七七八八了)
所以想一起驗證一下兩種方式的優劣.
存儲過程的方式
發現執行 exec insert_table_num 耗時 17min,約合 1000秒.
因爲需要穿件一個臨時表, 不是完全無侵入的
CREATE TABLE table_num (
table_name VARCHAR2(255),
table_num NUMBER
);
CREATE OR REPLACE PROCEDURE insert_table_num IS
BEGIN
FOR t IN (SELECT table_name FROM user_tables) LOOP
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO table_num (table_name, table_num)
SELECT ''' || t.table_name || ''', COUNT(*) FROM ' || t.table_name;
EXCEPTION
when others then
null ;
END;
END LOOP;
END;
exec insert_table_num;
SELECT * FROM table_num ORDER BY table_num DESC
Python方式獲取
STPython的方式一直不通
所以這次使用了jaydebeapi的方式連接數據庫
方式跟存儲過程是一個討論
循環查詢每個表的大小, 只不過Python是寫入到一個文件.
存儲過程是寫入一個表.
存儲過程耗時 1000秒
Python耗時 847秒
說明Python也沒有多慢.可能還少了一步插入數據庫的操作,性能更優秀一下.
Python方式獲取
1. ini配置文件定義數據庫連接.
[OSCAR]
jdbcString=com.oscar.Driver
driverPath=./driver/oscarJDBC8.jar
urlString=jdbc:oscar://10.110.xxx.xxx:2003/osrdb
userName=xxxxxx
passWord=xxxxx?!
Python部分的代碼爲:
import configparser
import datetime
import jaydebeapi
config = configparser.ConfigParser()
config.read('oscar.ini',encoding='utf-8')
jdbcString = config.get('OSCAR', 'jdbcString')
driverPath = config.get('OSCAR', 'driverPath')
urlString = config.get('OSCAR', 'urlString')
userName = config.get('OSCAR', 'userName')
passWord = config.get('OSCAR', 'passWord')
connoscar = jaydebeapi.connect(jdbcString, urlString, [userName, passWord], driverPath)
comparesql = configparser.ConfigParser()
comparesql.read('comparesql.ini',encoding='utf-8')
tablenamesql = "SELECT TABLE_NAME FROM INFO_SCHEM.DBA_TABLES WHERE OWNER = 'GSCLOUD2103OSCAR' order by table_name "
fname = open('zhaobsh.txt','w',encoding='utf-8')
cur=connoscar.cursor()
cur.execute(tablenamesql)
tablename = cur.fetchall()
num = 0
starttime = datetime.datetime.now()
for i in tablename:
j = str(i)
gettablenum = ("select count(1) from " + j[2:-3])
try:
cur.execute(gettablenum)
except:
continue
num = cur.fetchall()
numstr = str(num)
result = (j[2:-3] + " 表的行數爲: " + numstr[2:-3])
print(str(result))
fname.write(str(result) + '\n')
endtime = datetime.datetime.now()
seconds = (endtime - starttime).total_seconds()
print("執行時間爲: " + str(seconds))
fname.write("執行時間爲: " + str(seconds))
connoscar.close()
cur.close()
fname.close()