Python学习之十八_获取神通数据库所有的表数据量

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章