oracle数据库常见巡检脚本-系列一

简介

       作为数据库管理员(DBA),定期进行数据库的日常巡检是非常重要的。以下是一些原因:

        保证系统的稳定性:通过定期巡检,DBA可以发现并及时解决可能导致系统不稳定的问题,如性能瓶颈、资源利用率过高或磁盘空间不足等。
        提高数据的安全性:巡检可以帮助DBA发现潜在的安全风险,例如未经授权的访问、数据泄露或其他安全漏洞。及时采取措施,可以防止这些风险演变成实际问题。
        避免数据丢失:DBA可以通过检查备份和恢复策略来确保数据的完整性,并确保在发生灾难时能够快速恢复业务运营。
        确保合规性:许多行业都有特定的数据管理规定和法规要求。通过巡检,DBA可以确保他们的数据库管理系统符合这些规定和要求。
        性能优化:巡检可以帮助DBA识别性能瓶颈,从而优化数据库以提高其效率和响应速度。
        资源规划:通过巡检,DBA可以了解当前的资源使用情况,预测未来的资源需求,并根据需要调整资源配置。
        综上所述,DBA的日常巡检是保持数据库健康运行的关键环节之一,也是确保业务连续性和高效运行的重要步骤。

目录

1、查询碎片程度高的表

2、查询索引碎片的比例

3、集群因子clustering_factor高的表

4、根据sid查spid或根据spid查sid

5、根据sid查看具体的sql语句

6、根据spid查询具体的sql语句

7、查看历史session_id的SQL来自哪个IP

8、查询DML死锁会话sid,及引起死锁的堵塞者会话blocking_session

9、查询DDL锁的sql

10、查询锁住的DDL对象

11、查询当前正在执行的sql

12、查询正在执行的SCHEDULER_JOB

13、查询正在执行的dbms_job

14、查询一个会话session、process平均消耗多少内存,查看下面avg_used_M值

15、TOP 10 执行次数排序

16、TOP 10 物理读排序


1、查询碎片程度高的表

SELECT TABLE_NAME,(BLOCKS*8192/1024/1024)"理论大小M",
(NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)"实际大小M",round((NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024),3)*100||'%' "实际使用率%"FROM USER_TABLES where blocks>100 and (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024)<0.3
order by (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024) desc

        这个SQL语句是在Oracle数据库中执行的,它从USER_TABLES视图中获取信息,该视图包含所有由当前用户拥有的表的信息。查询结果包含了表名、表的理论大小(以MB为单位)、表的实际大小(以MB为单位)和表的实际使用率(百分比)。

下面详细解释各部分含义:
TABLE_NAME: 这是从USER_TABLES视图中选择的列,它表示表的名称。
(BLOCKS*8192/1024/1024): 这是一个表达式,用于计算每个表的理论大小。在这里,“BLOCKS”列代表表占用的数据块数量,每个数据块大小默认为8192字节。因此,BLOCKS8192)/1024/1024得到的结果就是表占用的空间大小(以MB为单位)。
(NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9): 这也是一个表达式,用于计算每个表的实际大小。在这里,“NUM_ROWS”列代表表中的行数,“AVG_ROW_LEN”列代表每行平均长度。“NUM_ROWSAVG_ROW_LEN”得到的结果是整个表占用的总字节数。然后将此结果除以1024再除以1024得到的结果是以MB为单位的表的实际大小。最后除以0.9是为了留出一部分未使用的空间,因为即使表中有空洞,Oracle也不会立即释放这部分空间。
round((NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024),3)*100||'%': 这是一个表达式,用于计算每个表的实际使用率(百分比)。首先计算出实际大小与理论大小的比例(即除法运算),然后使用ROUND函数对结果保留三位小数。最后乘以100并将结果转换为百分比形式。
where blocks>100 and (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024)<0.3: 这个条件限制了只显示那些块数量大于100且实际使用率小于30%的表。
order by (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024) desc: 这个排序子句将结果显示为实际使用率从低到高的顺序。

2、查询索引碎片的比例

select name,del_lf_rows,lf_rows,round(del_lf_rows / decode(lf_rows, 0, 1, lf_rows) * 100, 0) || '%' frag_pctfrom index_statswhere round(del_lf_rows / decode(lf_rows, 0, 1, lf_rows) * 100, 0) > 30;


        这个SQL查询来自Oracle数据库的INDEX_STATS视图,用于检索索引碎片化的程度。它返回的结果包括索引名称、删除的叶节点行数、叶节点行数以及碎片化百分比。
以下是每个字段的具体解释:

        name: 是索引的名字。
        del_lf_rows: 表示索引中已删除的叶子节点的数量。这表明曾经有记录存在于这些叶子节点,但现在已经不再使用它们。
        lf_rows: 表示索引的叶子节点总数。这是一个估计值,并非精确值。
        (del_lf_rows / decode(lf_rows, 0, 1, lf_rows)) * 100: 计算索引的碎片化程度。如果索引没有碎片,则该比例应接近于零;如果索引高度碎片化,则该比例应接近于100。

        在这个公式中,decode()函数用于处理lf_rows=0的情况,因为在这种情况下除以零会导致错误。如果lf_rows=0,则该函数会将其替换为1,使得结果可以正确计算。round(): 四舍五入函数,用于将结果四舍五入到最接近的整数。

        '%': 将结果转换为百分比格式。

         where round(del_lf_rows / decode(lf_rows, 0, 1, lf_rows) * 100, 0) > 30: 条件子句,仅显示碎片化程度超过30%的索引。

3、集群因子clustering_factor高的表

        集群因子越接近块数越好,接近行数则说明索引列的列值相等的行分布极度散列,可能不走索引扫描而走全表扫描

select tab.table_name,tab.blocks,tab.num_rows,ind.index_name,ind.clustering_factor,round(nvl(ind.clustering_factor, 1) /decode(tab.num_rows, 0, 1, tab.num_rows),3) * 100 || '%' "集群因子接近行数"from user_tables tab, user_indexes indwhere tab.table_name = ind.table_nameand tab.blocks > 100and nvl(ind.clustering_factor, 1) /decode(tab.num_rows, 0, 1, tab.num_rows) between 0.35 and 3

        这个查询从Oracle数据库的USER_TABLES和USER_INDEXES两个视图提取信息,这两个视图分别包含了用户所有的表及其索引的信息。该查询结果包括表名、表的块数、表的行数、索引名、索引的聚簇因子以及聚簇因子与表的行数之间的相对比例。
以下是每个字段的具体解释:

        table_name: 指定要查看的表的名称。
        blocks: 指定表所占的块数。每个块的大小通常为8192字节,所以可以根据该数值来估算表所占的空间大小。
        num_rows: 指定表的行数。
        index_name: 指定表对应的索引名。
        clustering_factor: 表示基于索引列上的值在物理存储上的聚集程度。较低的聚簇因子表示数据更紧密地分布在物理空间中,较高的聚簇因子表示数据较分散。聚簇因子与查询性能有关,在选择使用哪种类型的扫描时会参考这一因素(全表扫描或索引扫描)。


(nvl(ind.clustering_factor, 1) / decode(tab.num_rows, 0, 1, tab.num_rows)) * 100 || '%': 计算聚簇因子与行数之间的比例,将结果转换为百分比。nvl()函数用于处理可能为NULL的情况,如果ind.clustering_factor`为NULL,则该函数将其替换为1,以便可以进行除法运算。
between 0.35 and 3: 在WHERE子句中,该查询过滤出了聚簇因子与行数之间比例在0.35至3之间的表。这是根据经验设定的一个范围,一般来说,在这个范围内的表可能是最优的

4、根据sid查spid或根据spid查sid

select s.sid, s.serial#, s.LOGON_TIME, s.machine, p.spid, p.terminalfrom v$session s, v$process pwhere s.paddr = p.addrand s.sid = XXor p.spid = YY

        查询从Oracle数据库的SESSION和VPROCESS两个动态性能视图中提取信息,其中SESSION提供了会话的详细信息,而PROCESS则提供了进程的详细信息。
该查询结果包括会话ID(SID)、序列号(Serial#)、登录时间、客户端机器名称、操作系统进程ID(SPID)以及终端类型。


以下是每个字段的具体解释:
s.sid, s.serial#, s.LOGON_TIME, s.machine: 这些字段均来自于V$SESSION视图,分别代表会话ID、序列号、登录时间以及客户端机器名称。


p.spid, p.terminal: 这些字段均来自于V$PROCESS视图,分别代表操作系统的进程ID和终端类型。

where s.paddr = p.addr: 这个条件用于关联V$SESSION和v$PROCESS两个视图,使我们可以得到与会话相关联的操作系统进程信息。

and s.sid = XX: 如果需要查找特定的会话,可以在WHERE子句中
添加该条件。例如,如果您想查找SID为XX的会话,只需将XX替换为您想要查找的SID即可。

or p.spid = YY: 同样,如果您需要查找特定的操作系统进程,可以使用该条件进行查找。例如,如果您想查找SPID为YY的进程,只需将YY替换为您想要查找的SPID即可。

5、根据sid查看具体的sql语句

select username, sql_text, machine, osuserfrom v$session a, v$sqltext_with_newlines bwhere DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value) =b.hash_valueand a.sid = &sidorder by piece;

        查询从Oracle数据库的v$session 和v$sqltext_with_newlines两个动态性能视图中提取信息。v$session视图提供了关于当前活动会话的信息,包括会话ID(SID)、用户名等;而VSQLTEXT_WITH_NEWLINES视图则提供了一个SQL文本(含换行符)及其哈希值的信息。
以下是每个字段的具体解释:
   username: V$SESSION视图中的字段,代表当前用户的用户名。
    
    sql_text: V$SQLTEXT_WITH_NEWLINES视图中的字段,代表SQL语句及其参数值。
    
    machine: V$SESSION视图中的字段,代表连接的客户端机器名称。
    
    osuser: V$SESSION视图中的字段,代表操作系统用户。
    
    prev_hash_value, sql_hash_value: 分别代表V$SESSION视图中上一次执行的SQL语句的哈希值和当前正在执行的SQL语句的哈希值。
    
    b.hash_value: V$SQLTEXT_WITH_NEWLINES视图中的字段,代表SQL语句的哈希值。
    
    and a.sid = &sid: WHERE子句中的条件,代表查询指定会话的SID。
    
    order by piece: ORDER BY子句用于按照SQL文本片段进行排序,以便更好地查看SQL语句的不同部分。

6、根据spid查询具体的sql语句

select ss.SID,pr.SPID,ss.action,sa.SQL_FULLTEXT,ss.TERMINAL,ss.PROGRAM,ss.SERIAL#,ss.USERNAME,ss.STATUS,ss.OSUSER,ss.last_call_etfrom v$process pr, v$session ss, v$sqlarea sawhere ss.status = 'ACTIVE'and  ss.username is not nulland pr.ADDR = ss.PADDRand ss.SQL_ADDRESS = sa.ADDRESSand ss.SQL_HASH_VALUE = sa.HASH_VALUEand pr.spid = XX

 

这个查询从Oracle数据库的v$process,v$session和v$sqlarea三个视图中提取信息。V$PROCESS提供了关于操作系统进程的信息,v$session提供了关于活动会话的信息,而V$SQLAREA则提供了关于SQL地址和哈希值的相关信息。
下面是各字段的详细解析:

ss.SID: V$SESSION视图中的字段,代表当前活动会话ID。
pr.SPID: V$PROCESS视图中的字段,代表操作系统进程ID。
ss.action: V$SESSION视图中的字段,代表当前会话的动作,如“SELECT”、“INSERT”等。
sa.SQL_FULLTEXT: V$SQLAREA视图中的字段,提供了SQL语句及其参数值的完整文本。
ss.TERMINAL: V$SESSION视图中的字段,代表终端类型,如“VTY”、“TELNET”等。
ss.PROGRAM: V$SESSION视图中的字段,代表应用程序的名称,如“TOAD”、“PL/SQL Developer”等。
ss.SERIAL#: V$SESSION视图中的字段,代表会话序列号。
ss.USERNAME: V$SESSION视图中的字段,代表当前用户。
ss.STATUS: V$SESSION视图中的字段,代表会话的状态,如“ACTIVE”、“INACTIVE”等。
ss.OSUSER: V$SESSION视图中的字段,代表操作系统用户。
ss.last_call_et: V$SESSION视图中的字段,代表上次调用的时间(毫秒)。
pr.ADDR = ss.PADDR: 这个条件用于关联v$process,v$session两个视图,使我们可以在同一查询中获得操作系统进程和会话的信息。
ss.SQL_ADDRESS = sa.ADDRESS and ss.SQL_HASH_VALUE = sa.HASH_VALUE: 这两个条件用于关联v$session和v$sqlarea两个视图,使我们可以在同一查询中获得SQL语句及其地址和哈希值的信息。
and pr.spid = XX: 这个条件用于查找特定的OS进程ID。
这个查询主要用于查找特定操作系统的进程在当前活动会话中的详细信息,包括会话ID、动作、SQL语句及参数值、终端类型、程序名称、序列号、用户名称、状态、操作系统用户以及上次调用的时间等。

7、查看历史session_id的SQL来自哪个IP

当然这是个误解,都是历史的了,怎么可能还查到spid,其实查看trace文件名就可以知道spid,trace文件里面有sid和具体sql,如果trace存在incident,那trace就看不到具体sql,但是可以在incident文件中看到具体的sql,如DW_ora_17751.trc中17751就是spid,里面有这样的内容Incident 115 created, dump file: /XX/incident/incdir_115/DW_ora_17751_i115.trc,那么在DW_ora_17751_i115.trc就可以看到具体的sql语句)

DB_ora_29349.trc中出现如下
*** SESSION ID:(5057.12807) 2016-10-26 14:45:52.726

通过表V$ACTIVE_SESSION_HISTORY来查,如下
select a.sql_id,a.machine,a.* from V$ACTIVE_SESSION_HISTORY a where a.session_id=5057 and a.SESSION_SERIAL#=12807

查询上面的machine的IP是多少
select s.sid,s.serial#,s.LOGON_TIME,s.machine,p.spid,p.terminal from v$session s,v$process p where  s.paddr=p.addr and s.machine='localhost'

通过上面的spid在oracle服务器上执行netstat -anp |grep spid即可
 

[oracle@dwdb trace]$ netstat -anp |grep 17630
tcp      210      0 192.168.64.228:11095        192.168.21.16:1521          ESTABLISHED 17630/oracleDB
tcp        0      0 ::ffff:192.168.64.228:1521  ::ffff:192.168.64.220:59848 ESTABLISHED 17630/oracleDB

出现两个,说明来自220,连接了228数据库服务器,但是又通过228服务器的dblink去连接了16服务器

8、查询DML死锁会话sid,及引起死锁的堵塞者会话blocking_session

select sid,blocking_session,LOGON_TIME,sql_id,status,event,seconds_in_wait,state,BLOCKING_SESSION_STATUSfrom v$sessionwhere event like 'enq%'and state = 'WAITING'and BLOCKING_SESSION_STATUS = 'VALID'

        在Oracle数据库中,这个查询从v$session视图中检索信息,v$session视图提供了当前活动会话的相关信息。
下面是各字段的详细解析:

sid: 代表当前会话ID。
blocking_session: 代表阻塞该会话的其他会话ID。
LOGON_TIME: 代表当前会话的登录时间。
sql_id: 代表当前会话正在执行的SQL ID。
status: 代表当前会话的状态,如“ACTIVE”、“INACTIVE”等。
event: 代表等待事件,如“enqueue”、“latch free”等。
seconds_in_wait: 代表当前会话等待的时间(以秒为单位)。
state: 代表当前会话的执行状态,如“WAITING”、“RUNNING”等。
BLOCKING_SESSION_STATUS: 代表阻塞会话的状态,如“VALID”、“INVALID”等。
event like 'enq%': 这个条件用于筛选出等待队列事件中含有“enq”的会话,表明这些会话正在等待资源。
and state='WAITING': 这个条件用于筛选出正在等待状态的会话。
and BLOCKING_SESSION_STATUS='VALID': 这个条件用于筛选出有效的阻塞会话。


可以在v$session.LOGON_TIME上看到引起死锁的堵塞者会话比等待者要早

如果遇到RAC环境,一定要用gv$来查,并且执行alter system kill session 'sid,serial#'要到RAC对应的实例上去执行

或如下也可以
 

select(select username from v$session where sid=a.sid) blocker,a.sid,a.id1,a.id2,' is blocking ' "IS BLOCKING",(select username from v$session where sid=b.sid) blockee,b.sidfrom v$lock a, v$lock bwhere a.block = 1and b.request > 0and a.id1 = b.id1and a.id2 = b.id2;

        查询从v$lock视图中检索信息,v$lock视图提供了关于Oracle数据库锁的信息。该查询找出正在阻塞其他会话的会话,以及被阻塞的会话。
以下是各字段的详细解析:

(select username from v$session where sid=a.sid) blocker: 从中提取阻塞会话的用户名。
a.sid: 当前锁定会话ID。
a.id1: 锁定对象的第一部分标识符。
a.id2: 锁定对象的第二部分标识符。
`'is blocking ': 标识出阻塞者和被阻塞者的关系。
(select username from v$session where sid=b.sid) blockee: 从中提取被阻塞会话的用户名。
b.sid: 被阻塞会话ID。
where a.block = 1: 选出具有排他锁定模式的锁(即独占锁定)。
and b.request > 0: 选出请求解锁但尚未获取锁的会话(被阻塞的会话)。
and a.id1 = b.id1 and a.id2 = b.id2: 对应匹配的锁定对象。


9、查询DDL锁的sql

SELECT sid, event, p1raw, seconds_in_wait, wait_time
FROM sys.v_$session_wait
WHERE event like 'library cache %'

p1raw结果为'0000000453992440'

sid: 代表当前会话ID。
event: 当前会话正在等待的事件类型,如“library cache lock”、“library cache pin”等。
p1raw: 关于事件的详细信息,比如对象编号、表名等。
seconds_in_wait: 当前会话已经等待的时间(以秒为单位)。
wait_time: 当前会话等待的累计时间(以微秒为单位)。
WHERE event like 'library cache %': 这个条件用于筛选出事件名称中包含"library cache"的会话。

SELECT s.sid, kglpnmod "Mode", kglpnreq "Req", s.LOGON_TIME
FROM x$kglpn p, v$session s
WHERE p.kglpnuse=s.saddr
AND kglpnhdl='0000000453992440';

s.sid: 查询会话ID。
kglpnmod: x$kglpn视图中的字段,代表库缓存锁模式,例如“Row-X”,“Table-S”等。
kglpnreq: x$kglpn视图中的字段,表示是否持有锁。
s.LOGON_TIME: v$session视图中的字段,代表当前会话的登录时间。
p.kglpnuse=s.saddr: 这个条件用于关联x$kglpn和v$session视图,使得我们可以同时查看锁信息和会话信息。
AND kglpnhdl='0000000453992440': 这个条件用于筛选出指定对象的锁信息。 

10、查询锁住的DDL对象

select d.session_id, s.SERIAL#, d.namefrom dba_ddl_locks d, v$session swhere d.owner = 'MKLMIGEM'and d.SESSION_ID = s.sid

旨在从Oracle数据库的两个数据字典视图中检索信息:dba_ddl_locks 和 v$session。
这段代码:
        select d.session_id, s.SERIAL#, d.name: 这一行指定了查询结果应包含的列。其中 d.session_id 是从 dba_ddl_locks 视图选择的会话ID,s.SERIAL# 是从 v$session 视图选择的序列号,d.name 是从 dba_ddl_locks 视图选择的名称。
        from dba_ddl_locks d, v$session s: 这里列出了查询将使用两个数据字典视图,一个是 dba_ddl_locks,用别名 d 表示,另一个是 v$session,用别名 s 表示。
        where d.owner = 'MKLMIGEM': 这一行是一个过滤条件,它限制了查询结果只包括那些 dba_ddl_locks 视图中 owner 列的值为 'MKLMIGEM' 的行。这可能意味着你只对属于某个特定用户(即 'MKLMIGEM')的DDL锁感兴趣。
        and d.SESSION_ID = s.sid: 这是另一个过滤条件,它进一步限制了查询结果只包括那些在 dba_ddl_locks 视图中 SESSION_ID 列的值与在 v$session 视图中 sid 列的值相匹配的行。这可能是为了确保你检索的会话ID是匹配和一致的。

11、查询当前正在执行的sql

SELECT s.sid,s.serial#,s.username,spid,v$sql.sql_id,machine,s.terminal,s.program,sql_textFROM v$process, v$session s, v$sqlWHERE addr = paddrand s.sql_id = v$sql.sql_idAND sql_hash_value = hash_value

v$session(别名为s)

选择会话ID (sid)、

序列号 (serial#)、

用户名 (username)、

v$sql(别名为v$sql)选择SQL ID (sql_id)。

spid(可能表示进程ID)、

machine(表示机器名)、

terminal(表示终端名)、

program(表示程序名),

sql_text(表示SQL语句文本)

12、查询正在执行的SCHEDULER_JOB

select owner, job_name, sid, b.SERIAL#, b.username, spidfrom ALL_SCHEDULER_RUNNING_JOBS, v$session b, v$processwhere session_id = sidand paddr = addr

查询是从Oracle数据库的几个数据字典视图中检索信息。我将逐行解释代码的含义,并给出字段的描述:

select owner, job_name, sid, b.SERIAL#, b.username, spid: 这一行指定了查询结果应包含的列。owner调度作业的所有者,

job_name是作业的名称,

sid是Oracle会话的标识符,

SERIAL#是Oracle会话的序列号,

username是Oracle会话的用户名,

spid可能是进程ID。

 v$session b: 这里使用v$session视图,并给它指定了别名b。v$session视图包含关于数据库会话的信息。
,v$process: 这个视图包含关于数据库中进程的信息。
where session_id = sid: 这是一个过滤条件,它将查询结果限制为那些session_id列的值等于sid列的值的行。
and paddr = addr: 这是另一个过滤条件,它将查询结果限制为那些paddr列的值等于addr列的值的行。

13、查询正在执行的dbms_job

select job, b.sid, b.SERIAL#, b.username, spidfrom DBA_JOBS_RUNNING a, v$session b, v$processwhere a.sid = b.sidand paddr = addr

指定了查询结果应包含的列。
它选择了job列(指作业名称),
b.sid(Oracle会话的标识符),
b.SERIAL#(Oracle会话的序列号),
b.username(Oracle会话的用户名),
和spid(进程ID)。

14、查询一个会话session、process平均消耗多少内存,查看下面avg_used_M值

select round(sum(pga_used_mem) / 1024 / 1024, 0) total_used_M,round(sum(pga_used_mem) / count(1) / 1024 / 1024, 0) avg_used_M,round(sum(pga_alloc_mem) / 1024 / 1024, 0) total_alloc_M,round(sum(pga_alloc_mem) / count(1) / 1024 / 1024, 0) avg_alloc_Mfrom v$process;

select round(sum(pga_used_mem) / 1024 / 1024, 0) total_used_M,
这行代码计算了已使用的内存总量(以MB为单位)。pga_used_mem是每个进程已使用的PGA(Program Global Area)内存量,1024 * 1024是将这个量从字节转换为MB的转换因子。round(sum(pga_used_mem) / 1024 / 1024, 0)表示对总和进行四舍五入,保留小数点后0位。total_used_M是结果列的别名,表示已使用的内存总量(以MB为单位)。

round(sum(pga_used_mem) / count(1) / 1024 / 1024, 0) avg_used_M,
这行代码计算了每个进程平均使用的内存量(以MB为单位)。count(1)计算了进程的总数。所以,这行代码首先计算所有进程已使用的内存总量,然后除以进程总数,得到每个进程的平均使用量。avg_used_M是结果列的别名,表示每个进程平均使用的内存量(以MB为单位)。

round(sum(pga_alloc_mem) / 1024 / 1024, 0) total_alloc_M,
这行代码计算了已分配的内存总量(以MB为单位)。pga_alloc_mem是每个进程已分配的PGA内存量,同样,1024 * 1024是将这个量从字节转换为MB的转换因子。total_alloc_M是结果列的别名,表示已分配的内存总量(以MB为单位)。

round(sum(pga_alloc_mem) / count(1) / 1024 / 1024, 0) avg_alloc_M,
这行代码计算了每个进程平均分配的内存量(以MB为单位)。与第二行类似,它首先计算所有进程已分配的内存总量,然后除以进程总数,得到每个进程的平均分配量。avg_alloc_M是结果列的别名,表示每个进程平均分配的内存量(以MB为单位)。

15、TOP 10 执行次数排序

select *from (select executions, username, PARSING_USER_ID, sql_id, sql_textfrom v$sql, dba_userswhere user_id = PARSING_USER_IDorder by executions desc)where rownum <= 5;

执行次数(executions)、

用户名(username)、

解析用户ID(PARSING_USER_ID)、

SQL ID(sql_id)

SQL文本(sql_text)。

16、TOP 10 物理读排序

select *from (select DISK_READS,username,PARSING_USER_ID,sql_id,ELAPSED_TIME / 1000000,sql_textfrom v$sql, dba_userswhere user_id = PARSING_USER_IDorder by DISK_READS desc)where rownum <= 10;

(不要使用DISK_READS/ EXECUTIONS来排序,因为任何一条语句不管执行几次都会耗逻辑读和cpu,可能不会耗物理读(遇到LRU还会耗物理读,LRU规则是执行最不频繁的且最后一次执行时间距离现在最久远的就会被交互出buffer cache),是因为buffer cache存放的是数据块,去数据块里找行一定会消耗cpu和逻辑读的。Shared pool执行存放sql的解析结果,sql执行的时候只是去share pool中找hash value,如果有匹配的就是软解析。所以物理读逻辑读是在buffer cache中,软解析硬解析是在shared pool)

磁盘读取次数(DISK_READS)、

用户名(username)、

解析用户ID(PARSING_USER_ID)、

SQL ID(sql_id

SQL文本(sql_text)。

关注博主后续继续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解自动化之单元测试工具Junit

目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…

机器学习第12天:聚类

文章目录 机器学习专栏 无监督学习介绍 聚类 K-Means 使用方法 实例演示 代码解析 绘制决策边界 本章总结 机器学习专栏 机器学习_Nowl的博客-CSDN博客 无监督学习介绍 某位著名计算机科学家有句话&#xff1a;“如果智能是蛋糕&#xff0c;无监督学习将是蛋糕本体&a…

vue3-组合式API

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-组合式API 目录 组合式API 1.1 什么是组合式API 1.2 为什么使用它 1.2.1 更好的逻辑复用#…

“云浮云福保”暖心回归! 保障升级价格不变,医保个账可为全家缴费!

11月22日&#xff0c;2024年“云浮云福保”项目启动会在广东省云浮市迎宾馆成功举办。记者在会上获悉&#xff0c;“云浮云福保”是在云浮市医疗保障局、云浮市金融工作局、国家金融监督管理总局云浮监管分局指导下&#xff0c;的指导下&#xff0c;由中国人民财产保险股份有限…

高斯Filter 和 Bilateral Filter

参考链接&#xff1a; Python | Bilateral Filtering - GeeksforGeeks 高斯Filter&#xff1a; 高斯模糊后的图像中的每个像素的强度是由它周围的像素的加权平均得到的&#xff0c;这个权重就是高斯函数的值&#xff0c;它取决于像素之间的距离。具体来说&#xff1a; 通常会导…

PostMan接口测试教程

1、下载和安装 Postman: 前往 Postman 官网 &#xff08;https://www.postman.com&#xff09;&#xff0c;下载适用于你的操作系统的 Postman 客户端。 执行下载后的安装程序&#xff0c;并按照安装向导的指引完成安装过程。 2、创建一个新的集合&#xff1a; 打开 Postma…

引爆关注,聚焦上海新闻媒体邀请

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 上海拥有众多的新闻媒体机构&#xff0c;包括报纸、电视、广播和网络媒体等。这些媒体在报道国内外新闻、传播信息等方面发挥着重要作用。 其中&#xff0c;上海电视台是上海最大的电视…

邦永PM2项目管理系统 SQL注入漏洞复现

0x01 产品简介 邦永PM2项目管理系统科学地将项目管理思想和方法和谐、统一&#xff0c;使得长期以来困扰项目管理工作者的工期、进度、投资和成本情况无法整体动态管理的问题得到了全面而彻底的解决。 0x02 漏洞概述 邦永科技PM2项目管理平台Global_UserLogin.aspx接口处未对用…

解决ESP32内部RAM内存不足的问题

一&#xff0c;为什么需要外部RAM ESP32有520kB的内部RAM空间可以使用&#xff0c;这对于一般的情况是够用的&#xff0c;但是如果设备需要涉及音频或者显示图像等处理时&#xff0c;需要更大的内存空间来处理这些数据。ESP32支持扩展外部RAM&#xff0c;其实乐鑫已经在其ESP32…

接口自动化中cookies的处理技术

一&#xff0c;理论知识 为什么有cookie和session&#xff1f; 因为http协议是一种无状态的协议&#xff0c;即每次服务端接受到客户端的请求时都时一个全新的请求&#xff0c;服务器并不知道客户端的请求记录&#xff0c;session和cookie主要目的就是弥补http的无状态特性 …

G1垃圾收集器

G1收集器(-XX:UseG1GC) 前置文章&#xff1a;JVM垃圾收集器 G1 (Garbage-First)是一款面向服务器的垃圾收集器&#xff0c;主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时&#xff0c;还具备高吞吐量性能特征。 G1将Java堆划分为多个大小相等…

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路&#xff1a; class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值&#xff0c;除数是1&#xff0c;返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

口碑好的猫罐头有哪些?宠物店受欢迎的5款猫罐头推荐!

快到双十二啦&#xff01;铲屎官们是时候给家里猫主子囤猫罐头了。许多铲屎官看大促的各种品牌宣传&#xff0c;看到眼花缭乱&#xff0c;不知道选哪些猫罐头好&#xff0c;胡乱选又怕踩坑。 口碑好的猫罐头有哪些&#xff1f;作为一个经营宠物店7年的老板&#xff0c;活动期间…

二分查找——经典题目合集

文章目录 &#x1f99c;69. x 的平方根&#x1f33c;题目&#x1f33b;算法原理&#x1f337;代码实现 &#x1f433;35. 搜索插入位置&#x1f33c;题目&#x1f33b;算法原理&#x1f337;代码实现 &#x1f9ad;852. 山脉数组的峰顶索引&#x1f33c;题目&#x1f33b;算法原…

python-opencv划痕检测-续

python-opencv划痕检测-续 这次划痕检测&#xff0c;是上一次划痕检测的续集。 处理的图像如下&#xff1a; 这次划痕检测&#xff0c;我们经过如下几步: 第一步&#xff1a;读取灰度图像 第二步&#xff1a;进行均值滤波 第三步&#xff1a;进行图像差分 第四步&#xff1…

java创建指定分辨率的图片或修改图片的分辨率(DPI)

因为java默认的图片像素分辨率DPI72&#xff0c;分辨率有点低。所以研究了一下如何创建指定DPI的方案。 DPI&#xff1a; 指的是每英尺的像素点(dots per inch) JPEG图片 JPEG图片的元数据定义参看oracle官网。 https://docs.oracle.com/javase/8/docs/api/javax/imageio/me…

VulnHub DC-9

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

2011-2022年地级市互联网普及率数据

2011-2022年地级市互联网普及率数据 1、时间&#xff1a;2011-2022年 2、指标&#xff1a;行政区划代码、年份、地区、互联网宽带接入用户_千户、常住人口数_千人、户籍人口数_千人、每百人互联网宽带用户_常住人口口径、每百人互联网宽带用户_户籍人口口径 3、来源&#xf…

c语言编程(模考2)

简答题1 从键盘输入10个数&#xff0c;统计非正数的个数&#xff0c;并且计算非正数的和 #include<stdio.h> int main() {int i,n0,sum0;int a[10];printf("请输入10个数&#xff1a;");for(i0;i<10;i){scanf("%d",&a[i]);}for(i0;i<10…

【C++】类型转换

文章目录 C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_cast RTTI常见面试题 C语言中的类型转换 在C语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值…