
作者 | JiekeXu
来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)
如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)
大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看一线运维 DBA 五年经验常用 SQL 大全(三),欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!
本文作为常用 SQL 系列的第三篇,本文涉及到的 SQL 及相关命令均是在运维工作中总结整理而成的,对于运维 DBA 来说可提高很大的工作效率,值得收藏下来慢慢看。
前面两篇 SQL 常用命令链接,感兴趣的可点击下方超链接查看,
SQL 大全一 https://www.modb.pro/doc/22598
SQL 大全二 https://www.modb.pro/db/45337
由于编辑器显示原因不太友好,附本文 PDF 下载地址:
可直接在公众号后台回复【SQL大全三】获取
墨天轮链接:https://www.modb.pro/doc/91589
Oracle DBA 日常维护 SQL 脚本大全(收藏版) https://www.modb.pro/db/44364
本文 SQL 均是在运维工作中总结整理而成的,部分 SQL
来源于各个网站,但现在不知道具体来源哪个网站,如有侵权,可联系我及时删除。对于运维 DBA
来说可提高很大工作效率,当然如果你全部能够背下来那就牛逼了,如果不能,建议收藏下来慢慢看,每条 SQL 的使用频率都很高,肯定能够帮助到你。
目 录
1、查询表的主外键关联
2、查询一段时间内 sql 单次执行时间
3、查询历史会话阻塞等待情况
4、查询 undo 表空间使用较多的表
5、查询导致 undo 使用量和使用率高的会话
6、查看PGA使用率超过1G的会话
7、临时表空间使用率
8、使用临时表空间排序的会话
9、占用临时表空间的会话
10、检查锁表会话ID和对应操作系统进程号
11、查询导致锁的会话或进程sql
12、查询长时间锁表的会话
13、杀Session
14、查询sql执行计划
15、查询数据文件高水位线和最低可Resize值
16、查看数据库用户权限
17、每日归档量查询
18、System表空间使用率高
19、Oracle 监听日志 listener.log 达到4G
20、监听夯死时收集状态
21、下线 Oracle Job
22、查询碎片程度高的表和索引
23、查询当前会话进程分配使用的pga大小:
24、当前记录的等待事件相关会话数:
25、查看闪回区\快速恢复区空间使用率
26、查看表空间可用百分比
27、绑定变量相关 SQL
28、查询产生热块较多的对象
29、查询7天的db time
30、导出 AWR 报告的SQL语句
31、自动定时任务调整
32、非常详细的查看表空间使用率
33、检查过去7天表和索引的变化情况(输入时间和大写用户名)
34、监控每个TS的变化量
35、查 Oracle TPS
36、查看正在执行的 SQL
37、查看 SQL 的历史执行情况
38、查看索引创建速度
39、selectivity <5 一般选择性小于5% 就属于选择性差
40、如何查看列的选择性和基数呢?

1、查询表的主外键关联
select a.CONSTRAINT_NAME,b.TABLE_NAME 引用表,b.COLUMN_NAME 引用列,c.TABLE_NAME 被引用表,c.COLUMN_NAME 被引用列 fromuser_constraints a,user_cons_columns b,user_cons_columns cwhere a.CONSTRAINT_NAME=b.CONSTRAINT_NAMEand a.R_CONSTRAINT_NAME=c.CONSTRAINT_NAMEand a.CONSTRAINT_TYPE='R'and c.TABLE_NAME like 'T_PROD%';
2、查询一段时间内 sql 单次执行时间
select sql_id,s.SQL_TEXT,s.ELAPSED_TIME/s.EXECUTIONSfrom v$sqlstats swhere s.LAST_ACTIVE_TIME>to_date('20220124 12:00:00','yyyymmdd hh24:mi:ss')and s.LAST_ACTIVE_TIME>to_date('20220124 12:00:00','yyyymmdd hh24:mi:ss')and s.EXECUTIONS>0order by 3 desc;--查询一段时间内sql总等待时间select event,a.sql_id,sql_text,sum(time_waited)from v$active_session_history a,v$sql swhere a.SQL_ID=s.SQL_IDand a.SAMPLE_TIME>to_date('20220124 12:00:00','yyyymmdd hh24:mi:ss')and a.SAMPLE_TIMEgroup by event,a.sql_id,sql_textorder by 4 desc;
3、查询历史会话阻塞等待情况
select a.SAMPLE_TIME,a.SESSION_ID,a.SQL_ID,a.WAIT_TIME,a.BLOCKING_SESSION from v$active_session_history awhere a.MACHINE='41cb3c835bb1'and a.SAMPLE_TIME>to_date('20220125 15:50:00','yyyymmdd hh24:mi:ss')and a.SAMPLE_TIME4、查询 undo 表空间使用较多的表
select a.segment_name, count(*) from dba_undo_extents a, (SELECT n.name name FROM V$session s, V$transaction t, V$rollstat r, v$rollname n WHERE s.saddr = t.ses_addr AND t.xidusn = r.usn AND r.usn = n.usn) b where a.segment_name = b.name and a.status = 'ACTIVE' group by a.segment_name order by count(*);
5、查询导致 undo 使用量和使用率高的会话
select b.sid, b.serial#, b.username, b.machine, b.program, a.xidusn as "UndoSegID", a.used_ublk * to_number(rtrim(p.value))/1024/1024 as Undo_mb, c.name, d.tablespace_name from v$transaction a, v$session b, v$rollname c, dba_rollback_segs d, v$parameter p where a.addr = b.taddr and a.xidusn = c.usn and c.name = d.segment_name and p.name = 'db_block_size' order by Undo_mb desc;SELECT s.username, s.sid, s.serial#, t.xidusn, t.ubafil, t.ubablk, t.used_ublk, t.used_ublk / (select sum(blocks) from dba_data_files where tablespace_name = (select value from v$parameter where name = 'undo_tablespace')) * 100 as "使用率 %" FROM v$session s, v$transaction t WHERE s.saddr = t.ses_addr;
6、查看 PGA 使用率超过 1G 的会话
select s.sid, s.serial#, s.username, s.schemaname, s.machine, s.program, p.PGA_USED_MEM / 1024 / 1024 as "PGS Used(mb)", p.PGA_ALLOC_MEM / 1024 / 1024 as "PGS Allocate(mb)" from v$session s, v$process p where p.addr = s.paddr and s.username is not null and p.PGA_USED_MEM / 1024 / 1024 > 1142 order by p.PGA_USED_MEM;
7、临时表空间使用率
select tablespace_name, round(free_space / 1024 / 1024 / 1024, 2) "free(GB)", round(tablespace_size / 1024 / 1024 / 1024, 2) "total(GB)", round(nvl(free_space, 0) * 100 / tablespace_size, 3) "Free percent" from dba_temp_free_space;
8、使用临时表空间排序的会话
select se.username, se.sid, se.serial#, se.machine, se.program, su.extents, su.blocks * to_number(rtrim(p.value)) / 1024 / 1024 as Space_mb, tablespace, segtype, s.sql_text from v$sort_usage su, v$parameter p, v$session se, v$sql s where p.name = 'db_block_size' and s.HASH_VALUE = su.SQLHASH and s.ADDRESS = su.SQLADDR order by Space_mb desc;
9、占用临时表空间的会话
select s.sid, s.serial#, s.status, s.machine, s.program, t.username, t.sql_id, t.TABLESPACE, t.SEGTYPE, blocks from gv$session s, gv$tempseg_usage t where s.SADDR = t.SESSION_ADDR and s.serial# = t.session_num and s.INST_ID = t.inst_id;
10、检查锁表会话ID和对应操作系统进程号
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user_name, s.machine, s.terminal, o.object_name, s.logon_time, p.spid FROM v$locked_object l, all_objects o, gv$session s, v$process p WHERE l.object_id = o.object_id AND l.session_id = s.sid AND s.PADDR = p.ADDR ORDER BY sid, s.serial#;--使用spid查询相应machine的IP和进程启动时间:netstat -anp |grep spidps auxw|head -1ps auxw|grep SPIDps –ef | grep spid
11、查询导致锁的会话或进程 SQL
select s.sql_text,s.sql_id from v$sql s, v$session se, v$locked_object l where s.hash_value = se.SQL_HASH_VALUE and se.sid = l.session_id;select username, sql_text, machine, osuser from v$session a, v$sqltext_with_newlines b where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value) = b.hash_value and a.sid = &sid order by piece;select ss.SID, pr.SPID, ss.action, sa.SQL_FULLTEXT, ss.machine, ss.PROGRAM, ss.SERIAL#, ss.USERNAME, ss.STATUS, ss.OSUSER, ss.last_call_et from v$process pr, v$session ss, v$sqlarea sa where ss.status = 'ACTIVE' and ss.username is not null and pr.ADDR = ss.PADDR and ss.SQL_ADDRESS = sa.ADDRESS and ss.SQL_HASH_VALUE = sa.HASH_VALUE and pr.spid = &spid;
12、查询长时间锁表的会话
select s.sid,s.username,s.serial#,s.INST_ID,'alter system disconnect session '''||s.sid||','||s.serial#||',@'||s.INST_ID||''' immediate;',s.EVENT,s.machine,s.program,s.sql_id,l.ctime,l.type,l.lmode,l.request,o.object_name,o.object_typefrom gv$session s, gv$locked_object lo, gv$lock l, dba_objects owhere s.sid = l.sidand l.sid = lo.SESSION_IDand lo.OBJECT_ID = o.object_idand s.status='ACTIVE'and l.type in ('TX', 'TM')and s.USERNAME is not null and s.USERNAME<>'SYS'and ctime > 600;13、杀 Session
select 'alter system disconnect session '''||sid||','||serial#||''' immediate;' from v$session where username='BLUESKY';alter system disconnect session 'sid,serial#' immediate;--如果遇到RAC环境,一定要用gv$session来查,并且执行alter system disconnect session 'sid,serial#' immediate--要到RAC对应的实例上去执行
14、查询 SQL 执行计划
select * from table(dbms_xplan.display_awr('&&sql'));select a.hash_value,a.* from v$sql a where sql_id='&sql_id'select * from table(dbms_xplan.display_cursor(2729381371,0,'advanced'));select * from table(dbms_xplan.display_awr('91tw3s78z14k3'));含顺序的select * from table(xplan.display_cursor('9bd10aujay3gv',0,'advanced'));不过要先创建 xplan包,再执行SQL> CREATE PUBLIC SYNONYM XPLAN FOR SYS.XPLAN;SQL> grant execute on sys.xplan to public;15、查询数据文件高水位线和最低可 Resize 值
select c.tablespace_name, a.file#, a.name, a.bytes / 1024 / 1024 CurrentMB, ceil(HWM * a.block_size) / 1024 / 1024 ResizeTo, (a.bytes - HWM * a.block_size) / 1024 / 1024 ReleaseMB, 'alter database datafile ''' || a.name || ''' resize ' || ceil(HWM * a.block_size / 1024 / 1024) || 'M;' ResizeCMD from v$datafile a, (select file_id, max(block_id + blocks - 1) HWM from dba_extents group by file_id) b, dba_data_files c where a.file# = b.file_id(+) and (a.bytes - HWM * block_size) > 0 and a.file# = c.file_id order by 2;
16、查看数据库用户权限
select * from sys.dba_role_privs where granted_role='XXX';
17、每日归档量查询
SELECT SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024 AS "Size(M)", TRUNC(completion_time) FROM v$archived_log GROUP BY TRUNC(completion_time);--三日内归档切换频率查询:select sequence#, to_char(first_time, 'yyyymmdd_hh24:mi:ss') firsttime, round((first_time - lag(first_time) over(order by first_time)) * 24 * 60,2) minutes from v$log_history where first_time > sysdate - 3 order by first_time desc;
18、System 表空间使用率高
通常由于记录审计信息造成truncate table sys.aud$;
19、Oracle 监听日志 listener.log 达到 4G
-- listener 日志将无法再被记录,同时 listener 也会变得不稳定lsnrctl set log_status off;mv listener.log listener.log.1;lsnrctl set log_status on;或set current_listener XXXXset log_file XXXsave_config
20、监听夯死时收集状态
lsnrctl status XXX--查看是否长期出现监听的子进程及其pidps -ef|grep tnslsnr--对目标监听进程和子进程,收集至少2次进程堆栈pstack--收集strace的输出strace -frT -o /tmp/strace-lsnr.log -p
21、下线 Oracle Job
Begindbms_job.broken(43,true);commit;end;/Job相关试图:dba_scheduler_running_jobsdba_jobs(_running)
22、查询碎片程度高的表和索引
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_TABLESwhere blocks > 100and (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024 / 0.9) /(BLOCKS * 8192 / 1024 / 1024) < 0.3order by (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024 / 0.9) /(BLOCKS * 8192 / 1024 / 1024) desc;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;
23、查询当前会话进程分配使用的 pga 大小:
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_M from v$process;
24、当前记录的等待事件相关会话数:
select event, sum(decode(wait_time, 0, 0, 1)) "之前等待会话数", sum(decode(wait_time, 0, 1, 0)) "正在等待会话数", count(*) from v$session_wait group by event order by 4 desc;
25、查看闪回区\快速恢复区空间使用率
select sum(percent_space_used)||'%' "已使用空间比例" from V$RECOVERY_AREA_USAGE;
26、查看表空间可用百分比
select a.tablespace_name,b.total / 1024 / 1024 / 1024 total_gb,a.free/1024/1024/1024 free_gb,ROUND((total - free) / total, 4) * 100 "使用率%"from (select tablespace_name, sum(bytes) freefrom dba_free_spacegroup by tablespace_name) a,(select tablespace_name, sum(bytes) totalfrom dba_data_filesgroup by tablespace_name) bwhere a.tablespace_name = b.tablespace_nameorder by a.tablespace_name;--查看ASM磁盘组使用率select name,round(total_mb / 1024) "总容量",round(free_mb / 2) "空闲空间",round(((total_mb - free_mb) / total_mb) * 100) "使用率"from gv$asm_diskgroup;
27、绑定变量相关 SQL
select sql_id, FORCE_MATCHING_SIGNATURE, sql_textfrom v$SQLwhere FORCE_MATCHING_SIGNATURE in(select /*+ unnest */FORCE_MATCHING_SIGNATUREfrom v$sqlwhere FORCE_MATCHING_SIGNATURE > 0and FORCE_MATCHING_SIGNATURE != EXACT_MATCHING_SIGNATUREgroup by FORCE_MATCHING_SIGNATUREhaving count(1) > 10);
28、查询产生热块较多的对象
SELECT e.owner, e.segment_name, e.segment_type, b.tch FROM dba_extents e, (SELECT * FROM (SELECT dbarfil, dbablk, tch FROM x$bh ORDER BY tch DESC) WHERE ROWNUM < 11) b WHERE e.relative_fno = b.dbarfil AND e.block_id <= b.dbablk AND e.block_id + e.blocks > b.dbablk;
29、查询 7 天的 db time
WITH sysstat AS (select sn.begin_interval_time begin_interval_time, sn.end_interval_time end_interval_time, ss.stat_name stat_name, ss.value e_value, lag(ss.value, 1) over(order by ss.snap_id) b_value from dba_hist_sysstat ss, dba_hist_snapshot sn where trunc(sn.begin_interval_time) >= sysdate - 7 and ss.snap_id = sn.snap_id and ss.dbid = sn.dbid and ss.instance_number = sn.instance_number and ss.dbid = (select dbid from v$database) and ss.instance_number = (select instance_number from v$instance) and ss.stat_name = 'DB time')select to_char(BEGIN_INTERVAL_TIME, 'mm-dd hh24:mi') || to_char(END_INTERVAL_TIME, ' hh24:mi') date_time, stat_name, round((e_value - nvl(b_value, 0)) / (extract(day from(end_interval_time - begin_interval_time)) * 24 * 60 * 60 + extract(hour from(end_interval_time - begin_interval_time)) * 60 * 60 + extract(minute from(end_interval_time - begin_interval_time)) * 60 + extract(second from(end_interval_time - begin_interval_time))), 0) per_sec from sysstat where (e_value - nvl(b_value, 0)) > 0 and nvl(b_value, 0) > 0;
30、导出 AWR 报告的 SQL 语句
select * from dba_hist_snapshotselect * from table(dbms_workload_repository.awr_report_html(DBID, INSTANCE_NUMBER, startsnapid,endsnapid))select * from TABLE(DBMS_WORKLOAD_REPOSITORY.awr_diff_report_html(DBID, INSTANCE_NUMBER, startsnapid,endsnapid, DBID, INSTANCE_NUMBER, startsnapid,endsnapid));
31、自动定时任务调整
col WINDOW_NAME for a15col REPEAT_INTERVAL for a60col DURATION for a30set linesize 120SELECT t1.window_name, t1.repeat_interval, t1.durationFROM dba_scheduler_windows t1, dba_scheduler_wingroup_members t2WHERE t1.window_name = t2.window_nameAND t2.window_group_name IN('MAINTENANCE_WINDOW_GROUP', 'BSLN_MAINTAIN_STATS_SCHED');WINDOW_NAME REPEAT_INTERVAL DURATION--------------- ------------------------------------------------------------ ------------------------------MONDAY_WINDOW freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0 +000 04:00:00TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0 +000 04:00:00WEDNESDAY_WINDO freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00THURSDAY_WINDOW freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0 +000 04:00:00FRIDAY_WINDOW freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0 +000 04:00:00SATURDAY_WINDOW freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0 +000 20:00:00SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0 +000 20:00:00--备注:#freq=daily:每天收集;#;byday=SUN:一周之内的星期,例如这里是星期日;#byhour=22 :每天的时间点时,这里是22时;#byminute=0:每天的的时间点分,这里是0分,则第1分;#bysecond=0:每天的时间点秒,这里是0秒,则第1秒;#+000 20:00:00 :表示收集信息的时间区间长,这里表示20小时。---修改自动收集统计信息计划任务时间:--首先停止原来计划;BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."THURSDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."MONDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."TUESDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."WEDNESDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."FRIDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."SATURDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.DISABLE(name => '"SYS"."SUNDAY_WINDOW"');end;/--修改计划任务的执行时间:BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."THURSDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."MONDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."TUESDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."WEDNESDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."FRIDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."SATURDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."SUNDAY_WINDOW"',attribute => 'REPEAT_INTERVAL',value =>'freq=daily;byday=THU;byhour=3;byminute=0;bysecond=0');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."SATURDAY_WINDOW"',attribute => 'DURATION',value =>'+000 04:00:00');end;/BEGINDBMS_SCHEDULER.SET_ATTRIBUTE(name => '"SYS"."SUNDAY_WINDOW"',attribute => 'DURATION',value =>'+000 04:00:00');end;/--启用新的计划任务的执行时间:BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."THURSDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."MONDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."TUESDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."WEDNESDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."FRIDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."SATURDAY_WINDOW"');end;/BEGINDBMS_SCHEDULER.ENABLE(name => '"SYS"."SUNDAY_WINDOW"');end;/禁用 SQL TUNING TASKBEGINdbms_auto_task_admin.disable(client_name => 'sql tuning advisor',operation => NULL,window_name => NULL);END;/BEGINdbms_auto_task_admin.disable(client_name => 'auto space advisor',operation => NULL,window_name => NULL);END;/
32、非常详细的查看表空间使用率
SET PAGESIZE 9999 LINESIZE 180;TTI 'Tablespace Usage Status'COL TABLESPACE_NAME FOR A20;COL TBS_MAX_SIZE FOR 99999.99;COL TABLESPACE_SIZE FOR 99999.99;COL TBS_AVABLE_SIZE FOR 999999.99;COL "USED_RATE(%)" FOR A16;COL "ACT_USED_RATE(%)" FOR A16;COL "FREE_SIZE(GB)" FOR 99999999.99;SELECT UPPER(F.TABLESPACE_NAME) AS "TABLESPACE_NAME",ROUND(D.MAX_BYTES,2) AS "TBS_MAX_SIZE" ,ROUND(D.AVAILB_BYTES ,2) AS "ACT_TABLESPACE_SIZE",ROUND((D.AVAILB_BYTES - F.USED_BYTES),2) AS "TBS_USED_SIZE",ROUND(F.USED_BYTES, 2) AS "FREE_SIZE(GB)",TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) / D.AVAILB_BYTES * 100,2),'999.99') AS "USED_RATE(%)",TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES)/D.MAX_BYTES*100,2),'999.99') AS "ACT_USED_RATE(%)",ROUND(D.MAX_BYTES - D.AVAILB_BYTES +USED_BYTES,2) AS "TBS_AVABLE_SIZE"FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 6) USED_BYTES,ROUND(MAX(BYTES) / (1024 * 1024 * 1024), 6) MAX_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME) F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024 * 1024), 6) AVAILB_BYTES,ROUND(SUM(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))/(1024*1024*1024),6) MAX_BYTESFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME) DWHERE D.TABLESPACE_NAME = F.TABLESPACE_NAMEORDER BY "ACT_USED_RATE(%)" DESC;vim get_tablespace_used_v3.sqlset pagesize 1000 linesize 180tti 'Tablespace Usage Status'col "TOTAL(GB)" for 99,999,999.999col "USAGE(GB)" for 99,999,999.999col "FREE(GB)" for 99,999,999.999col "EXTENSIBLE(GB)" for 99,999,999.999col "MAX_SIZE(GB)" for 99,999,999.999col "FREE PCT %" for 999.99col "USED PCT OF MAX %" for 999.99col "NO_AXF_NUM" for 9999col "AXF_NUM" for 999select d.tablespace_name "TBS_NAME",d.contents "TYPE",nvl(a.bytes /1024/1024/1024,0) "TOTAL(GB)",nvl(a.bytes - nvl(f.bytes,0),0)/1024/1024/1024 "USAGE(GB)",nvl(f.bytes,0)/1024/1024/1024 "FREE(GB)",nvl((a.bytes - nvl(f.bytes,0))/a.bytes * 100,0) "FREE PCT %",nvl(a.ARTACAK,0)/1024/1024/1024 "EXTENSIBLE(GB)",nvl(a.MAX_BYTES,0)/1024/1024/1024 "MAX_SIZE(GB)",nvl((a.bytes - nvl(f.bytes,0))/ (a.bytes + nvl(a.ARTACAK,0)) * 100,0) "USED PCT OF MAX %",a.NO_AXF_NUM,a.AXF_NUMfrom sys.dba_tablespaces d,(select tablespace_name,sum(bytes) bytes,sum(decode(autoextensible,'YES',maxbytes - bytes,0 )) ARTACAK,count(decode(autoextensible,'NO',0)) NO_AXF_NUM,count(decode(autoextensible,'YES',0)) AXF_NUM,sum(decode(maxbytes, 0, BYTES, maxbytes)) MAX_BYTESfrom dba_data_filesgroup by tablespace_name) a,(select tablespace_name,sum(bytes) bytesfrom dba_free_spacegroup by tablespace_name) fwhere d.tablespace_name = a.tablespace_name(+)and d.tablespace_name = f.tablespace_name(+)and not (d.extent_management like 'LOCAL'and d.contents like 'TEMPORARY')union allselect d.tablespace_name "TBS_NAME",d.contents "TYPE",nvl(a.bytes /1024/1024/1024,0) "TOTAL(GB)",nvl(t.bytes,0)/1024/1024/1024 "USAGE(GB)",nvl(a.bytes - nvl(t.bytes,0),0)/1024/1024/1024 "FREE(GB)",nvl(t.bytes/a.bytes * 100,0) "FREE PCT %",nvl(a.ARTACAK,0)/1024/1024/1024 "EXTENSIBLE(GB)",nvl(a.MAX_BYTES,0)/1024/1024/1024 "MAX_SIZE(GB)",nvl(t.bytes/(a.bytes + nvl(a.ARTACAK,0)) * 100,0) "USED PCT OF MAX %",a.NO_AXF_NUM,a.AXF_NUMfrom sys.dba_tablespaces d,(select tablespace_name,sum(bytes) bytes,sum(decode(autoextensible,'YES',MAXbytes - bytes,0 )) ARTACAK,count(decode(autoextensible,'NO',0)) NO_AXF_NUM,count(decode(autoextensible,'YES',0)) AXF_NUM,sum(decode(maxbytes, 0, BYTES, maxbytes)) MAX_BYTESfrom dba_temp_filesgroup by tablespace_name) a,(select tablespace_name, sum(bytes_used) bytesfrom v$temp_extent_poolgroup by tablespace_name) twhere d.tablespace_name = a.tablespace_name(+)and d.tablespace_name = t.tablespace_name(+)and d.extent_management like 'LOCAL'and d.contents like 'TEMPORARY%'order by 6 desc;
33、检查过去 7 天表和索引的变化情况(输入时间和大写用户名)
SELECT *FROM ( SELECT c.TABLESPACE_NAME,c.segment_name,b.object_type,ROUND (SUM (space_used_delta) / 1024 / 1024, 2) "Growth (MB)"FROM dba_hist_snapshot sn,dba_hist_seg_stat a,dba_objects b,dba_segments cWHERE begin_interval_time > TRUNC (SYSDATE) - &days_backAND sn.snap_id = a.snap_idAND b.object_id = a.obj#AND b.owner = c.ownerAND b.object_name = c.segment_nameAND c.owner = '&SCHEMANAME'GROUP BY c.TABLESPACE_NAME, c.segment_name, b.object_type)ORDER BY 1,4 ASC;
34、监控每个 TS 的变化量
SELECT TO_CHAR (sp.begin_interval_time,'YYYY-MM-DD') days, ts.tsname, max(round((tsu.tablespace_size* dt.block_size )/(1024*1024),2) ) cur_size_MB, max(round((tsu.tablespace_usedsize* dt.block_size )/(1024*1024),2)) usedsize_MBFROM DBA_HIST_TBSPC_SPACE_USAGE tsu, DBA_HIST_TABLESPACE_STAT ts, DBA_HIST_SNAPSHOT sp, DBA_TABLESPACES dtWHERE tsu.tablespace_id= ts.ts#AND tsu.snap_id = sp.snap_idAND ts.tsname = dt.tablespace_nameAND ts.tsname NOT IN ('SYSAUX','SYSTEM')AND TS.tsname='&TBS_NAME'GROUP BY TO_CHAR (sp.begin_interval_time,'YYYY-MM-DD'), ts.tsnameORDER BY days ;35.、查 Oracle TPS
select instance_number, metric_unit, trunc(begin_time) time, sum(average*3600) "Transactions Per Day", --一天的平均总和 avg(average) "Transactions Per Second" --某个时间段的平均值 from DBA_HIST_SYSMETRIC_SUMMARY where metric_unit = 'Transactions Per Second' and begin_time >= to_date('2022-04-18 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and begin_time < to_date('2022-04-18 16:00:00', 'yyyy-mm-dd hh24:mi:ss') group by instance_number, metric_unit, trunc(begin_time)order by instance_number;36、查看正在执行的 SQL
set echo off feedback off timing off pause offset pages 100 lines 155 trimspool on trimout on space 1 recsep offcol username format a13col prog format a10 trunccol sql_text format a40 trunccol sid format a12col sql_id format a16col child for 99999col execs format 9999999col sqlprofile format a22col avg_ela for 999999.99col last_ela for 999999col event format a20select /*+ rule */sid||','||serial# sid,substr(a.event,1,15) event,b.sql_id||','||child_number sql_id,plan_hash_value,executions execs,(elapsed_time/decode(nvl(executions,0),0,1,executions))/1000000 avg_ela,last_call_et last_ela,sql_textfrom v$session a, v$sql bwhere status = 'ACTIVE'and username is not nulland a.sql_id = b.sql_idand a.sql_child_number = b.child_numberand sql_text not like '%from v$session a, v$sql b%'and a.program not like '%(P%)'order by plan_hash_value,last_call_et,sql_id, sql_child_number;--字段含义:SID:为sid和serial#的值。EVENT:等待事件。 SQL_ID:为sql_id和child_number的值。PLAN_HASH_VALUE:sql执行计划的PLAN_HASH_VALUE。EXECS:执行次数。AVG_ELA:平均执行时间。LAST_ELA:本次已经执行了多久。SQL_TEXT:sql文本。
37、查看 SQL 的历史执行情况
set echo off feedback off timing off pause off verify offset pages 100 lines 132 trimspool on trimout on space 1 recsep offaccept v_sqlid prompt 'Enter sqlid(default xxx): ' default 'xxxxxxx'accept v_days prompt 'Enter Days ago(default 7): ' default 7col execs for 999,999,999col etime for 999,999,999.9col avg_elas for 999,999.999col avg_cpus for 999,999.999col avg_lios for 999,999,999.9col avg_pios for 9,999,999.9col begin_interval_time for a30col node for 99999break on plan_hash_value on startup_time skip 1select to_char(begin_time,'mmdd hh24:mi') btime,sql_id,plan_hash_value,sum(execs) execs,sum(etime)/sum(decode(execs,0,1,execs)) avg_elas,sum(cpu_time)/sum(decode(execs,0,1,execs)) avg_cpus,sum(lio)/sum(decode(execs,0,1,execs)) avg_lios,sum(pio)/sum(decode(execs,0,1,execs)) avg_piosfrom(select ss.instance_number node,begin_interval_time begin_time,sql_id,plan_hash_value,nvl(executions_delta,0) execs,elapsed_time_delta/1000000 etime,(elapsed_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta))/1000000 avg_etime,buffer_gets_delta lio,disk_reads_delta pio,cpu_time_delta/1000000 cpu_time,(buffer_gets_delta/decode(nvl(buffer_gets_delta,0),0,1,executions_delta)) avg_lio,(cpu_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta)) avg_cpu_timefrom DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SSwhere sql_id = '&&v_sqlid'and ss.snap_id = s.snap_idand ss.instance_number = S.instance_numberand elapsed_time_delta>0)where begin_time >= sysdate-&&v_daysgroup by to_char(begin_time,'mmdd hh24:mi'),sql_id, plan_hash_valueorder by 1/undefine v_sqlidundefine v_days--字段含义:BTIME:快照时间点。SQL_ID:sql_idPLAN_HASH_VALUE:sql执行计划的PLAN_HASH_VALUE,如果这里为空,表示遵循上一个PLAN_HASH_VALUE。EXECS:执行次数。AVG_ELAS:平均执行时间。AVG_CPUS:平均cpu时间AVG_LIOS:平均逻辑读数量
38、查看索引创建速度
set line 250col ssid format 9999 heading SID;col opname format a15 TRUNCATE ;col target format a28 TRUNCATE ;col es format 99999.9 Heading "Time|Ran";col tr format 99999.90 Heading "Time|Left";col pct format 999.90 Heading "PCT";col RATE FORMAT a6 truncate Heading "I/O |Rate/m" ;col program format a20 TRUNCATE;col MACHINE format a20 truncate;select L.sid ssid, substr(OPNAME,1,15) opname,target, trunc((sofar/totalwork)*100) pct, to_char(60*sofar*8192/(24*60*(last_update_time - start_time))/1024/1024/60, '9999.0') Rate,elapsed_seconds/60 es,time_remaining/60 tr,PROGRAM,MACHINEfrom v$session_longops L,V$SESSION Swhere time_remaining > 0 AND L.SID=S.SIDorder by start_time;
39、selectivity <5 一般选择性小于 5% 就属于选择性差
select a.OWNER, a.INDEX_NAME, a.TABLE_NAME, a.DISTINCT_KEYS Cardinality, a.NUM_ROWS, round(a.DISTINCT_KEYS / NUM_ROWS * 100, 2) selectivity from dba_ind_statistics a where a.NUM_ROWS > 0 and round(a.DISTINCT_KEYS / NUM_ROWS * 100, 2) <= 5 and A.OWNER = upper('&owner'); --如果统计信息有可能不是最新的 最好使用下面的语句select table_name,index_name,round(distinct_keys/num_rows * 100, 2) selectivity from user_indexes;40、如何查看列的选择性和基数呢?
select a.column_name,b.num_rows,a.num_distinct Cardinality,round(a.num_distinct / b.num_rows * 100, 2) selectivity,a.histogram,a.num_bucketsfrom dba_tab_col_statistics a, dba_tables bwhere a.owner = b.ownerand a.table_name = b.table_nameand a.owner = upper('&owner')and a.table_name = upper('&table_name')and a.column_name = upper('&column_name');全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
————————————————————————————
公众号:JiekeXu DBA之路
CSDN :https://blog.csdn.net/JiekeXu
墨天轮:https://www.modb.pro/u/4347
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————

Oracle 表碎片检查及整理方案
OGG|Oracle GoldenGate 基础
2021 年公众号历史文章合集整理
2020 年公众号历史文章合集整理
Oracle 19c RAC 遇到的几个问题
OGG|Oracle 数据迁移后比对一致性
利用 OGG 迁移 Oracle11g 到 19C
OGG|Oracle GoldenGate 微服务架构
Oracle 查询表空间使用率超慢问题一则
国产数据库|TiDB 5.4 单机快速安装初体验
Oracle ADG 备库停启维护流程及增量恢复
Linux 环境搭建 MySQL8.0.28 主从同步环境
