[20231115]如何快速获取AWR中涉及到的表.txt

[20231115]如何快速获取AWR中涉及到的表.txt

–//昨天看了链接:如何快速获取AWR中涉及到的表=>https://www.cnblogs.com/jyzhao/p/how-to-get-tables-in-awr.html
–//作者介绍的方法是直接从awr报表抽取from后面的信息,grep写法还很少用.

grep -o -i ‘\bFROM\s\+\(\w\+\)' awr. | -e ‘s/FROM //i' | -u

-o 表示只输出匹配的部分
-i 表示不区分大小写
\b 表示单词边界
FROM 表示匹配 FROM 关键字
\s+ 表示一个或多个空白字符
(\w+) 表示一个或多个字母数字字符(表名或视图名)
sort -u 表示排序并去重

–//这样抽取出来除了表名还有视图名等等.能否换一种方式如果知道sql_id抽取表名呢?很明显这样抽取还包含视图名.
–//另外我测试一下:
$ grep -o -i ‘\bfrom\s\+\(\w\+\)' awr.html
–//根本抽取不到任何信息,不知道对方如何操作的.

–//我想起查询表获得对应sql_id的,脚本如下,参数5,6对应owner,table_namne.

SELECT /*+ MATERIALIZE ordered use_hash(d) use_hash(c) */
DISTINCT c.kglobt03 sql_id
FROM sys.x$kglob o
,sys.x$kgldp d
,sys.x$kglcursor c
WHERE o.inst_id = USERENV (‘Instance')
AND d.inst_id = USERENV (‘Instance')
AND c.inst_id = USERENV (‘Instance')
AND o.kglnaown = upper(nvl(‘&5',user))
AND o.kglnaobj = upper(‘&6')
AND d.kglrfhdl = o.kglhdadr
AND c.kglhdadr = d.kglhdadr;

–//按照该脚本修改一下就可以实现该功能。
$ cat sqlt.
column owner format a20
column table_name format a30
column ot format a50

with sqla as ( SELECT /*+ MATERIALIZE leading(c d o ) use_nl(d) use_nl(o) */
DISTINCT o.kglnaown owner, o.kglnaobj table_name
FROM sys.x$kglob o
,sys.x$kgldp d
,sys.x$kglcursor c
WHERE o.inst_id = USERENV (‘Instance')
AND d.inst_id = USERENV (‘Instance')
AND c.inst_id = USERENV (‘Instance')
AND d.inst_id=o.inst_id
AND c.inst_id=d.inst_id
and c.kglobt03 = ‘&1'
AND d.kglrfhdl = o.kglhdadr
AND c.kglhdadr = d.kglhdadr)
select owner,table_name,owner||'.'||table_name ot from dba_tables where (owner,table_name) in (select * from sqla);

–//参数1 对应sql_id,脚本仅仅查询支持一个sql_id.仅仅需要建立一张表包含awr出现的sql_id就ok了.
–//这很容易收集,DBA_HIST_SQLTEXT或者dba_hist_sqlstat基本包含全部出现的sql_id.
and c.kglobt03 in (select sql_id from sqlb)

–//提示给修改一下:
$ cat sqltt.sql
column owner format a20
column table_name format a30
column ot format a40

with
sqlb as ( SELECT /*+ MATERIALIZE */ distinct sql_id from DBA_HIST_SQLTEXT),
sqla as ( SELECT /*+ MATERIALIZE leading(c d o) use_hash(d) use_hash(c) */
DISTINCT o.kglnaown owner, o.kglnaobj table_name
FROM sys.x$kglob o
,sys.x$kgldp d
,sys.x$kglcursor c
WHERE o.inst_id = USERENV (‘Instance')
AND d.inst_id = USERENV (‘Instance')
AND c.inst_id = USERENV (‘Instance')
and c.kglobt03 in ( select sql_id from sqlb)
AND d.kglrfhdl = o.kglhdadr
AND c.kglhdadr = d.kglhdadr)
select owner,table_name,owner||'.'||table_name ot from dba_tables where (owner,table_name) in (select * from sqla);

–//当然这样抽取一定要在预热之后,已经在共享池的情况下.大部分表都能捕捉到.环境两边都需要执行1次.
–//我在生产测试一下,运行也不是很慢.
–//顺便说一下涉及到X$我的脚本是抽取不到的.

给TA打赏
共{{data.count}}人
人已打赏
运维笔记

集群容灾解决方案之Rose HA

2023-10-10 15:54:49

数据库

[20231114]如何知道一条sql语句涉及到那些表.txt

2023-11-18 14:32:43

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索