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

python,学习,十八,获取,神通,数据库,所有,数据量 · 浏览次数 : 124

小编点评

**存储过程方式** 1. 使用 `exec` 语句执行 SQL 语句,并捕获结果。 2. 使用 `cur.fetchall()` 获取结果并将其写入文件。 3. 使用 `end` 关键字结束循环。 **Python 方式** 1. 使用 `configparser` 读取配置文件。 2. 使用 `jaydebeapi` 连接数据库。 3. 使用 `cur.execute()` 执行 SQL 语句。 4. 使用 `cur.fetchall()` 获取结果并将其写入文件。 5. 使用 `close` 方法关闭数据库连接。 **优劣比较** **存储过程方式** * 性能更快,因为它不需要创建临时表。 * 更易于维护,因为代码更加简洁。 **Python 方式** * 更易读,因为代码更加清晰。 * 性能略低于存储过程方式。 * 需要加载 `configparser` 和 `jaydebeapi` 库。 **选择方法的建议** 如果性能是主要考虑因素,那么存储过程方式应该是更好的选择。如果代码更重要,或者您对性能有严格要求,那么 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()

与Python学习之十八_获取神通数据库所有的表数据量相似的内容:

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

# Python学习之十八_获取神通数据库所有的表数据量 ## 背景 ``` 今天想获取一下所有数据库的表信息.但是发现神通数据库的系统表里面的表信息不正确 无法获取实际意义的表信息. 联系了下神通数据库的原厂高手. 给了一个存储过程可以进行相关的处理. 因为最近学习python(放下一周就忘记的七

Python学习之十一_Windows获取硬件信息

Python学习之十一_Windows获取硬件信息 简介 网上找了一些方法简单整理了下,可以快速获取部分信息 包含机器名称等. 以及序列号相关 部分学习来源: https://blog.51cto.com/u_15354476/5339864 源码 import psutil import wmi

Python学习之十八_django的学习(二)

# Python学习之十八_django的学习(二) ## 前言 ``` 前面学习了基本的django的使用. 这里想着稍微深入一点学习templates 以及进行级联的路由展示. ``` ## 修改配置文件 ``` 要想使用 templates下面的文件. 需要修改一下项目级别的 settings

Python学习之十_paramiko的简单学习

Python学习之十_paramiko的简单学习 简介 pywinrm 是python用于连接访问windows的工具 paramiko 是python用于连接访问linux的工具 ansible等工具很多也是基于类似的组件进行的处理 连接不同的系统进行命令行的操作. paramiko的简介 par

Python学习之十三_pip的学习

Python学习之十三_pip的学习 pip的含义 pip: pip is the package installer for Python. You can use pip to install packages from the Python Package Index and other in

Python学习之十九_程序运行时间的验证

# Python学习之十九_程序运行时间的验证 ## 背景 ``` 最近一段时间比较忙. 而且还遇到了一个lua脚本优化redis访问的场景. 想着自己还在学习python(时断时续) 所以想借着这个场景,学习一下python连接redis,以及验证lua脚本和原生redis命令的效率问题. 虽然方

[转帖]Python学习之十七_django的入门

# Python学习之十七_django的入门 ## 前言 ``` Python学习了一周, 慢慢总结摸索. 自己还是有多不会的地方. 感慨这些年浪费的时间. 所有的时间都是选择大于努力. 努力最多感动自己. 生活是需要的是正确的选择. 平凡的实在人太难在一个固化的社会生存. 共勉. ``` ##

gRPC入门学习之旅(十)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一...

算法金 | 只需十四步:从零开始掌握Python机器学习(附资源)

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 1. 引言 1.1 教程目的与读者定位 "启程"往往是最具挑战性的一步,特别是在面临众多选择时,人们往往难以做出决策。本教程旨在帮助那些几乎没有Python机器学习基础的初学者成长为知识

Python学习之四_部分battery的学习

Python学习之四_部分battery的学习 CentOS升级pip的方法 yum install python3 之后, 一般centos的版本都很低, 有时候很多module 是无法安装的. 一般可以通过他进行升级: pip3 install -U pip 注意如果无法升级, 可以先这样处理