正文
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()