APEX日里面每个表的查询次数统计
1.背景
通过APEX的报表查询情况,停止不再被查询的作业
2.思路
方法一:
1.apex自带的日志视图apex_workspace_activity_log里面只有二级菜单栏的统计次数
2.解析APX的.sql文件,找出来表和每个菜单栏对应的关系。或者使用apex的视图APEX_APPLICATION_PAGE_REGIONS里面二级菜单栏和表的对应关系
方法二:
1.查询oracle的查询历史记录,然后解析SQL,把表按照每次查询的pv统计。
2.解析APX的.sql文件,找出来表和每个菜单栏对应的关系。
3.实现步骤
方法一:
1.查询次数统计
-- 每一个页的查询次数
select
application_id, page_id, page_name, count(1) as view_pv
from oracle_apex_workspace_activity_log
where dt = ${bizdate}
and application_id in (101,125)
and apex_user != 'nobody'
and to_char(VIEW_DATE,'yyyymmdd') = ${bizdate}
group by application_id, page_id, page_name
2.找出表和二级菜单栏的对应关系
import re
import pymysqldef read():# 读取文件f = open("f125.sql",encoding='utf-8')lines = f.read()prompt = lines.split('prompt')regex = r"\w+(?=@)"regex_page = r"(?<=application/pages/page_)\d+"page=''table=''applicationid='125'# 数据库不给连接,只好把语句打印出来,放在数据库里面执行了# pymysql = MysqlClient("", "", "", "")for pro in prompt:if( '@' in pro ):matches = re.finditer(regex_page, pro, re.MULTILINE)for matchNum, match in enumerate(matches, start=1):page = match.group()matches = re.finditer(regex, pro, re.MULTILINE)for matchNum, match in enumerate(matches, start=1):table = match.group()# print(page + "====" + table)sql = "insert INTO oracle_table_page values ('"+applicationid+"','"+ page[2:] +"','"+ table+"');"print(sql)# pymysql.update(sql)f.close()class MysqlClient:def __init__(self, db, host, user, password):self.conn = pymysql.connect(host=host, user=user, password=password, db=db, charset="utf8mb4")self.cursor = self.conn.cursor()def select(self, sql, args):self.cursor.execute(query=sql, args=args)return self.cursor.fetchall()# 删除、更新、插入def update(self, sql):temp = self.cursor.execute(sql)self.conn.commit()return tempif __name__ == '__main__':read()
3.插入数据库
因为可能解析出来多行同一个表对应的页面名,所以可以把表名,应用名,页面名做成联合组件,然后插入的时候,如果已经有就更新,没有就新增。
1.mysql可以直接用replace into
REPLACE INTO test.oracle_table_page (page,table_name) values ('00014','APEX_GOODS_UP_KEEP_D');
2.oracle没有replace的语法,可以使用merge into。或者在表上面建一个触发器实现
merge into 的方法需要再建一个没有主键的临时表
merge into tablea a ----要更新或者操作的表
using tablec c ----源表 using (select * from tablec ) c
on a.id=c.id--匹配条件
when matched then set a.price=c.price --当匹配时进行更新操作
when not matched then --不匹配进行插入操作
insert values values(c.id,c.price)
触发器
CREATE OR REPLACE EDITIONABLE TRIGGER "YVAN"."TAR_oracle_table_page2" BEFORE INSERT ON "YVAN".ORACLE_TABLE_PAGE FOR EACH ROW
BEGIN
DELETE FROM "YVAN".ORACLE_TABLE_PAGE WHERE TABLE_NAME = :NEW.TABLE_NAME and APPLICATION_ID =:NEW.APPLICATION_ID and PAGE = :NEW.PAGE ;
END ;ALTER TRIGGER "YVAN"."TAR_oracle_table_page2" ENABLE;insert INTO oracle_table_page values ('125','257','apex_market_newold_index');
4.同步数据到大数据,然后建立作业
1.同步作业省略
2.调度作业
select a.APPLICATION_ID, d.page_parent_name, a.page_id, a.PAGE_NAME, a.TABLE_NAME, b.view_pv, c.cdm_target_table, c.dgc_job_name , c.workspace, c.dli_table, c.cdm_job_name, c.last_execution_time, c.cdm_cluster_name , ${bizdate} as dt
from (-- 表和page的对应关系selecta.APPLICATION_ID,cast(a.page AS INT) as page_id,lcase(a.TABLE_NAME) as TABLE_NAME,b.PAGE_NAMEfrom ORACLE_TABLE_PAGE a left join (select distinct APPLICATION_ID, PAGE_ID, PAGE_NAMEfrom APEX_APPLICATION_PAGE_REGIONSwhere APPLICATION_ID in (101,125))bon a.APPLICATION_ID=b.APPLICATION_IDand cast(a.page AS INT) = b.PAGE_ID
)a
left join (-- 每个page的访问次数select application_id, page_id, page_name, count(1) as view_pvfrom oracle_apex_workspace_activity_logwhere dt = ${bizdate} and application_id in (101,125)and apex_user != 'nobody'and to_char(VIEW_DATE,'yyyymmdd') = ${bizdate}group by application_id, page_id, page_name
)b
on a.application_id = b.APPLICATION_ID
and a.page_id = b.page_id
left join (select cdm_target_table, dgc_job_name , workspace, dli_table, cdm_job_name, last_execution_time, cdm_cluster_name from (-- 表和作业对应关系select lcase(cdm_target_table) as cdm_target_table, dgc_job_name , workspace, lcase(dli_table) as dli_table, cdm_job_name, last_execution_time , cdm_cluster_name, row_number() over (PARTITION BY lcase(cdm_target_table) order by last_execution_time desc ) as rank_numfrom yishou_data.dwd_hw_cdm_job_info where cdm_export_conn in ("apex_oracle_slave12_6","oracle_master_16","apex_oracle_slave_52","oracle52","oracle_slave_52","oracle_slave12c_6"))WHERE rank_num = 1)c
on c.cdm_target_table = a.TABLE_NAME
left join (-- page和一级菜单栏对应的关系select page_name, page, page_parent_name, applicationfrom oracle_tabular_view where page_parent_name <> '-'
)d
on a.application_id = d.application
and a.page_id = d.page
;
方法二:
1.解析Oracle的SQL
-- 截取函数
SELECT distinct name
,dbms_lob.substr(replace(REGEXP_SUBSTR(DATA_SOURCE, '\w+@', 1, LEVEL, 'i'),'@','')) AS STR
FROM
(select name, DATA_SOURCE from APEX_190200.WWV_FLOW_JET_CHART_SERIESwhere FLOW_ID in (101,125) -- and page_id = '58'
)
CONNECT BY LEVEL < REGEXP_COUNT(DATA_SOURCE, '\w+@') + 1
;
APEX日里面每个表的查询次数统计相关推荐
- 7月26日 MySql单表查询作业
作业要求: 数据库productorder. 1.customer表 1).查询所有顾客信息. 2).查询姓名和联系人相同的顾客信息 3).查询所在城市是北京的顾客姓名,顾客地址,顾客所在城市,邮编. ...
- 【数据库1】mysql,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆,连接池,jdbc,redis,crontab,ftp,oracle,数据交换/存储/收集
文章目录 1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化) 1.1 服务端:双击mysql-installer-community-5.6.22.0.msi 1.2 客户端:命令行 ...
- jpa多表关联查询_JPA【关联查询篇】
摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...
- 查询qt中的数据_EXCEL在多表中查询数据(函数中引用工作表的办法)
与EXCEL打交道也好几年了,你是不是还停留在经常性简单而重复的工作呢?每月忙的时候天天加班,空闲的时候盯着手机刷刷刷,,既然如此,轻松的时候就应该琢磨下怎样提升效率,比如规范好自己的数据源,设计一套 ...
- oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析
oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...
- django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
2019独角兽企业重金招聘Python工程师标准>>> 1.多表连接查询:当我知道这点的时候顿时觉得django太NX了. class A(models.Model): ...
- Web程序员的Mysql进阶序二之sql多条数据插入、多条数据更新、多表同时查询
数据库在web开发的时候,减少连接次数可以降低数据库负载,所以一次连接,多数据操作可以有效的优化数据库. 假设表结构如下: create table test(name varchar(10),sex ...
- java调用js查询mongo_mongodb操作之使用javaScript实现多表关联查询
一.数据控制 mongodb操作数据量控制,千万控制好,不要因为操作的数据量过多而导致失败. 演示一下发生此类错误的错误提示: 二.多表关联查询实现 /* 声明变量bridge,用来记录两个集合所连接 ...
- mysql查一个表3到5行的数据类型_MySQL入门(三) 数据库表的查询操作【重要】
序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...
最新文章
- 对象存储HTML自定义属性,设置对象属性_对象存储服务 OBS_SDK参考_Node.js_上传对象_华为云...
- 区域填充与击中击不中变换
- 最新maven插件的安装
- 【机器学习】Logistic Regression 的前世今生(理论篇)
- hibernate教程--关联关系的映射
- SpringCloud Greenwich(三)注册中心之zookeeper、Zuul和 gateway网关配置
- 多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态
- 解决在vue init webpack my-project卡住的问题(已解决)
- HTML5按键打开摄像头和拍照
- c语言 0494-方程求根,C语言:作业一 选择结构.doc
- Mysql集群拆分_MySQL 5.7跨集群拆分迁移
- android 设备实现定时重启(无root权限或已root)
- 阿克曼函数Ackerman
- Linux 安装telnet命令及使用
- Flash游戏开发必备书籍
- eth转入地址_ETH智能合约靶机 审计学习攻略
- codevs 1535 封锁阳光大学
- 为什么在很多应用中常采用正态分布/高斯分布、中心极限定理
- QtAndroid详解 6 集成信鸽推送
- php doctrine,PHP和Doctrine:如何创建唯一ID
热门文章
- 黑马学成在线-媒资管理
- “三鹿乳业”会不会上市?
- 有关 MicroBlaze中xil_prinf/pirntf/print的一些问题
- Ubuntu系统连接罗技K380键盘
- LaTeX 表格里的内容太长想换行怎么办
- “GNSSOPDS”数据下载程序介绍
- 程序员如何赚到自己人生中的第一桶金?是100万还会是1000万,大家不妨一起探讨一下!...
- Android 录音获取麦克风实时音量(转)--资料
- android ui头像圆角化,APP界面设计当中,为什么喜欢把头像设计成圆形
- 超级狗是集软件授权、课件保护和身份认证于一身的加密狗。