--ORACLE
1、查询碎片程度高的表
条件为什么 block>100,因为一些很小的表,只有几行数据实际大小很小,但是 block 一次性分配就是 5 个
(11g 开始默认一次性分配 1M 的 block 大小了,见 create table storged 的 NEXT 参数),5 个
block 相对于几行小表数据来说就相差太大了。
算法中/0.9 是因为块的 pfree 一般为 10%,所以一个块最多只用了 90%,而且一行数据大于 8KB 时容易产
生行链接,把一行分片存储,一样的一个块连 90%都用不满、
AVG_ROW_LEN 还是比较准的,比如个人实验情况一表 6 个字段,一个 number,其他 5 个都是 char(100)
但是实际数据都是’1111111’7 位,AVG_ROW_LEN 显示依然为 513
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
2、查询索引碎片的比例
select name,del_lf_rows,lf_rows,
round(del_lf_rows/decode(lf_rows,0,1,lf_rows)*100,0)||'%' frag_pct from
index_stats where round(del_lf_rows/decode(lf_rows,0,1,lf_rows)*100,0)>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 ind where tab.table_name=ind.table_name
and tab.blocks>100
and nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows) between
0.35 and 3
4、根据 sid 查 spid 或根据 spid 查 sid
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.sid=XX or p.spid=YY
5、根据 sid 查看具体的 sql 语句
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;
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_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 = XX
7、查看历史 session_id 的 SQL 来自哪个 IP
(当然这是个误解,都是历史的了,怎么可能还查到 spid,其实查看 trace 文件名就可以知道 spid,trace
文件里面有 sid 和具体 sql,如果 trace 存在 incident,那 trace 就看不到具体 sql,但是可以在
评论