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