数据库分析的一些语句

最近在做了次数据库的割接,整理了下操作中的分析语句:

 

1. 分析数据库表空间

方法一:这个方法当空间爆满时无法查出满了的表空间

SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
       D.TOT_GROOTTE_MB "表空间大小(M)",
       D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
       TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
                     2),
               '990.99') "使用比",
       F.TOTAL_BYTES "空闲空间(M)",
       F.MAX_BYTES "最大块(M)"
  FROM (SELECT TABLESPACE_NAME,
               ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
               ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
          FROM SYS.DBA_FREE_SPACE
         GROUP BY TABLESPACE_NAME) F,
       (SELECT DD.TABLESPACE_NAME,
               ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
          FROM SYS.DBA_DATA_FILES DD
         GROUP BY DD.TABLESPACE_NAME) D
 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
 ORDER BY 4 DESC;

方法二:解决上面爆满的问题

SELECT A.TABLESPACE_NAME,  A.BYTES/1024/1024 TOTAL_M, B.BYTES/1024/1024 USED_M, C.BYTES/1024/1024 FREE_M, (B.BYTES*100)/A.BYTES "% USED", (C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A, SYS.SM$TS_USED B, SYS.SM$TS_FREE C WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;

 

空间不足后需要添加表空间,以下供参考:

alter tablespace TBS_QUERY add datafile '/home/oracle/oracle/product/10.2.0/oradata/dajun/tbs_query01.dbf' size 2048m autoextend off;

 

2. 分析各表数据量大小

Select Segment_Name,Sum(bytes)/1024/1024 tab_size
From User_Extents t
where t.segment_type='TABLE'
Group By Segment_Name
order by tab_size desc;

 

3. 确认表空间对应的数据文件

select a.name,b.name from v$tablespace a, v$datafile b where a.ts#=b.ts#;

 

4. 对有外键约束进行关闭、开启

alter table 表名 disable constraint 约束名;

alter table 表名 enable constraint 约束名; 

5.查询用户、权限等

1.查看所有用户:
select * from dba_user;
select * from all_users;
select * from user_users;
2.查看用户系统权限:
select * from dba_sys_privs;
select * from all_sys_privs;
select * from user_sys_privs;
3.查看用户对象权限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
4.查看所有角色:
select * from dba_roles;
5.查看用户所拥有的角色:
select * from dba_role_privs;
select * from user_role_privs;

 

6. 在使用user_tables中的num_rows做为数据迁移检查时,出现了与表实际数据不一至的情况

分析后认为是oracle对user_tables的没有即时刷新,需要对表进行分析处理。

分析表的语法:analyze table table_name compute statistics;

参过如下语句:

方法一:

--生成当前用户下所有的表分析语句

spool 路径/AnalyzeTab.sql;

select 'analyze table '||t1.TABLE_NAME||' compute statistics;' from user_tables t1;

spool off;

执行AnalyzeTab.sql即可。

 

方法二:由于分析过程不可见,谨慎使用。对于大数据量的用户不建议使用。

create or replace procedure Pro_AnalyzeTables is
  cursor cur_tab is
    select table_name from user_tables;
  record_cur_tab cur_tab%rowtype;
begin
  open cur_tab;
  loop
    fetch cur_tab
      into record_cur_tab;
    exit when cur_tab%notfound;
    --dbms_output.put_line('Start Analyze '||record_cur_tab.table_name);
    execute immediate 'analyze table ' || record_cur_tab.table_name ||
                      ' compute statistics';
    --dbms_output.put_line('End Analyze '||record_cur_tab.table_name);
  end loop;
end Pro_AnalyzeTables;

 

 

7. 分析一个表的主外键关连关系

select a.owner 主键拥有者
       ,a.table_name 主键表
       ,b.column_name 主键列
       ,C.OWNER 外键拥有者
       ,c.table_name 外键表
       ,d.column_name 外键列
from user_constraints  a
left join user_cons_columns b on  a.constraint_name=b.constraint_name
left join user_constraints C ON C.R_CONSTRAINT_NAME=a.constraint_name
left join user_cons_columns d on c.constraint_name=d.constraint_name
where  a.constraint_type='P'
    and  a.table_name=upper('bi_wo_info') --需要查看主外键关系的表
order by a.table_name 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值