当前位置:  数据库>oracle

Oracle 表空间管理和优化

    来源: 互联网  发布时间:2017-05-27

    本文导语: Oracle 表空间管理和优化 1. TOM大神的表查询和授权语句create or replace procedure SHOW_SPACE(P_SEGNAME  IN VARCHAR2,                                       P_OWNER    IN VARCHAR2 DEFAULT USER,                                       P_TYPE ...

Oracle 表空间管理和优化

1. TOM大神的表查询和授权语句
create or replace procedure SHOW_SPACE(P_SEGNAME  IN VARCHAR2,
                                      P_OWNER    IN VARCHAR2 DEFAULT USER,
                                      P_TYPE      IN VARCHAR2 DEFAULT 'TABLE',
                                      P_PARTITION IN VARCHAR2 DEFAULT NULL)
-- THIS PROCEDURE USES AUTHID CURRENT USER SO IT CAN QUERY DBA_*
  -- VIEWS USING PRIVILEGES FROM A ROLE AND SO IT CAN BE INSTALLED
  -- ONCE PER DATABASE, INSTEAD OF ONCE PER USER WHO WANTED TO USE IT.
AUTHID CURRENT_USER AS
  L_FREE_BLKS          NUMBER;
  L_TOTAL_BLOCKS      NUMBER;
  L_TOTAL_BYTES        NUMBER;
  L_UNUSED_BLOCKS      NUMBER;
  L_UNUSED_BYTES      NUMBER;
  L_LASTUSEDEXTFILEID  NUMBER;
  L_LASTUSEDEXTBLOCKID NUMBER;
  L_LAST_USED_BLOCK    NUMBER;
  L_SEGMENT_SPACE_MGMT VARCHAR2(255);
  L_UNFORMATTED_BLOCKS NUMBER;
  L_UNFORMATTED_BYTES  NUMBER;
  L_FS1_BLOCKS        NUMBER;
  L_FS1_BYTES          NUMBER;
  L_FS2_BLOCKS        NUMBER;
  L_FS2_BYTES          NUMBER;
  L_FS3_BLOCKS        NUMBER;
  L_FS3_BYTES          NUMBER;
  L_FS4_BLOCKS        NUMBER;
  L_FS4_BYTES          NUMBER;
  L_FULL_BLOCKS        NUMBER;
  L_FULL_BYTES        NUMBER;
  -- INLINE PROCEDURE TO PRINT OUT NUMBERS NICELY FORMATTED
  -- WITH A SIMPLE LABEL.
  PROCEDURE P(P_LABEL IN VARCHAR2, P_NUM IN NUMBER) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(RPAD(P_LABEL, 40, '.') ||
                        TO_CHAR(P_NUM, '999,999,999,999'));
  END;
BEGIN
  -- THIS QUERY IS EXECUTED DYNAMICALLY IN ORDER TO ALLOW THIS PROCEDURE
  -- TO BE CREATED BY A USER WHO HAS ACCESS TO DBA_SEGMENTS/TABLESPACES
  -- VIA A ROLE AS IS CUSTOMARY.
  -- NOTE: AT RUNTIME, THE INVOKER MUST HAVE ACCESS TO THESE TWO
  -- VIEWS!
  -- THIS QUERY DETERMINES IF THE OBJECT IS AN ASSM OBJECT OR NOT.
  BEGIN
    EXECUTE IMMEDIATE 'SELECT TS.SEGMENT_SPACE_MANAGEMENT
FROM DBA_SEGMENTS SEG, DBA_TABLESPACES TS
WHERE SEG.SEGMENT_NAME = :P_SEGNAME
AND (:P_PARTITION IS NULL OR
SEG.PARTITION_NAME = :P_PARTITION)
AND SEG.OWNER = :P_OWNER
AND SEG.TABLESPACE_NAME = TS.TABLESPACE_NAME'
      INTO L_SEGMENT_SPACE_MGMT
      USING P_SEGNAME, P_PARTITION, P_PARTITION, P_OWNER;
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('THIS MUST BE A PARTITIONED TABLE, USE P_PARTITION => ');
      RETURN;
  END;
  -- IF THE OBJECT IS IN AN ASSM TABLESPACE, WE MUST USE THIS API
  -- CALL TO GET SPACE INFORMATION; ELSE WE USE THE FREE_BLOCKS
  -- API FOR THE USER MANAGED SEGMENTS.
  IF L_SEGMENT_SPACE_MGMT = 'AUTO' THEN
    DBMS_SPACE.SPACE_USAGE(P_OWNER,
                          P_SEGNAME,
                          P_TYPE,
                          L_UNFORMATTED_BLOCKS,
                          L_UNFORMATTED_BYTES,
                          L_FS1_BLOCKS,
                          L_FS1_BYTES,
                          L_FS2_BLOCKS,
                          L_FS2_BYTES,
                          L_FS3_BLOCKS,
                          L_FS3_BYTES,
                          L_FS4_BLOCKS,
                          L_FS4_BYTES,
                          L_FULL_BLOCKS,
                          L_FULL_BYTES,
                          P_PARTITION);
    P('UNFORMATTED BLOCKS ', L_UNFORMATTED_BLOCKS);
    P('FS1 BLOCKS (0-25) ', L_FS1_BLOCKS);
    P('FS2 BLOCKS (25-50) ', L_FS2_BLOCKS);
    P('FS3 BLOCKS (50-75) ', L_FS3_BLOCKS);
    P('FS4 BLOCKS (75-100)', L_FS4_BLOCKS);
    P('FULL BLOCKS ', L_FULL_BLOCKS);
  ELSE
    DBMS_SPACE.FREE_BLOCKS(SEGMENT_OWNER    => P_OWNER,
                          SEGMENT_NAME      => P_SEGNAME,
                          SEGMENT_TYPE      => P_TYPE,
                          FREELIST_GROUP_ID => 0,
                          FREE_BLKS        => L_FREE_BLKS);
    P('FREE BLOCKS', L_FREE_BLKS);
  END IF;
  -- AND THEN THE UNUSED SPACE API CALL TO GET THE REST OF THE
  -- INFORMATION.
  DBMS_SPACE.UNUSED_SPACE(SEGMENT_OWNER            => P_OWNER,
                          SEGMENT_NAME              => P_SEGNAME,
                          SEGMENT_TYPE              => P_TYPE,
                          PARTITION_NAME            => P_PARTITION,
                          TOTAL_BLOCKS              => L_TOTAL_BLOCKS,
                          TOTAL_BYTES              => L_TOTAL_BYTES,
                          UNUSED_BLOCKS            => L_UNUSED_BLOCKS,
                          UNUSED_BYTES              => L_UNUSED_BYTES,
                          LAST_USED_EXTENT_FILE_ID  => L_LASTUSEDEXTFILEID,
                          LAST_USED_EXTENT_BLOCK_ID => L_LASTUSEDEXTBLOCKID,
                          LAST_USED_BLOCK          => L_LAST_USED_BLOCK);
  P('TOTAL BLOCKS', L_TOTAL_BLOCKS);
  P('TOTAL BYTES', L_TOTAL_BYTES);
  P('TOTAL MBYTES', TRUNC(L_TOTAL_BYTES / 1024 / 1024));
  P('UNUSED BLOCKS', L_UNUSED_BLOCKS);
  P('UNUSED BYTES', L_UNUSED_BYTES);
  P('LAST USED EXT FILEID', L_LASTUSEDEXTFILEID);
  P('LAST USED EXT BLOCKID', L_LASTUSEDEXTBLOCKID);
  P('LAST USED BLOCK', L_LAST_USED_BLOCK);
END;
让普通用户能执行SYS.SHOW_SPACE
SYS@zcs11G>  drop user zcs1 CASCADE;
create user zcs identified by zcs;
grant connect,resource,dba to zcs;
grant execute on SYS.SHOW_SPACE TO zcs;
connect zcs/zcs
drop table t1 purge;
create table t1 (id int,name varchar2(19)) segment creation IMMEDIATE tablespace users;
set serverout on;
exec sys.show_space('T1');

2.Shrink收缩高水位实操:
ALTER TABLE MOVE 步骤:
1. desc username.table_name  ----检查表中是否有LOB
2. 如果表没有LOB字段
    直接 alter table move; 然后 rebuild index
--如果表中包含了LOB字段
alter table owner.table_name move tablespace tablespace_name lob (lob_column) store as lobsegment      tablespace tablespace_name;
           
--也可以单独move lob,但是表上面的index 同样会失效,这是不推荐的
alter table owner.table_name move lob(lob_column) store as lobsegment tablespace tablespace_name ;
3. rebuild index
 首先用下面的SQL查看表上面有哪类索引:
select a.owner,a.index_name,a.index_type,a.partitioned,a.status,b.status p_status,b.composite from dba_indexes
a left join dba_ind_partitions b on a.owner=b.index_owner and a.index_name=b.index_name where a.owner='&owner'  and a.table_name='&table_name';
         
对于普通索引直接rebuild index index_name online nologging parallel,对于分区索引,必须单独rebuild 每个分区,对于组合分区索引,必须单独rebuild 每个子分区。
4.对表收集统计信息
限制:
虽然在10g中可以用shrink ,但也有些限制:
1). 对cluster,cluster table,或具有Long,lob类型列的对象 不起作用。
2). 不支持具有function-based indexes 或 bitmap join indexes的表
3). 不支持mapping 表或index-organized表。
4). 不支持compressed 表

3.MOVE收缩高水位
一、shrink操作
1.行的rowid会改变所以表必须启用row movement
SYS@zcs11G>  alter table t4 enable row movement;
2.shrink space cascade(cascade可省略)
SYS@zcs11G>  alter table t4 shrink space cascade;
4.shrink space可分成两步单步执行
1、shrink space  compact  忙时:仅重整表记录行,HWM及索引不变
2、shrink space  cascade  闲时:其余全部动作

相关阅读:

Oracle Undo 镜像数据探究

Oracle 回滚(ROLLBACK)和撤销(Undo)

Undo 表空间损坏导致无法open

Undo表空间失败的处理方法

Oracle Undo表空间重建与恢复


    
 
 

您可能感兴趣的文章:

  • 求助:oracle9在redhat9上安装好后,oracle管理工具会在菜单工具栏上显示吗?
  • Oracle自动存储管理支持库 ASMLib
  • Oracle ASM自动管理存储管理简介
  • windows上要装什么软件才能管理到linux上的oracle?
  • 在HP Unix 下Oracle的控制和管理
  • 用Oracle管理服务器将数据导入与导出
  • Oracle管理工具 phpOraAdmin
  • Linux上管理本机Oracle的时候出现找不到ServiceName的错误
  • 有谁知道Oracle8的数据库管理工具是用什么开发工具编写的?
  • 甲骨文新推Oracle Linux管理软件包
  • oracle区管理和段空间管理详细介绍
  • Oracle 管理Undo数据
  • 关于Oracle数据库管理员认证方法简述
  • Oracle 权限管理入门
  • Oracle使用配置文件创建口令管理策略
  • Oracle中Datafiles的管理
  • Oracle 9i中自动撤销管理的优点分析
  • Oracle帐户管理
  • Oracle数据库安全性管理基本措施实例解析
  • php iis7站长之家
  • oracle查看表空间已分配和未分配空间的语句分享
  • shell脚本操作oracle删除表空间、创建表空间、删除用户
  • oracle 创建表空间步骤代码
  • oracle增加表空间大小两种实现方法
  • RedHat8上解压Oracle9磁盘丢失磁盘空间,请大虾帮忙!
  • ORACLE数据库空间整理心得
  • oracle9i 在 redhat7.3 上安装临时目录空间不够.
  • Oracle 10g创建表空间和用户并指定权限
  • Linux下Oracle传输表空间高手支招
  • Oracle释放undo表空间
  • oracle 创建表空间详细介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,