DBMS_SPACE

(一)WILL COST

1. index cost需要先分析对应表: 
execute dbms_stats.gather_table_stats(ownname =>'owner', tabname => 'table_name');
DBMS_SPACE.CREATE_INDEX_COST (
   ddl                IN    VARCHAR2,
   used_bytes      OUT   NUMBER,
   alloc_bytes     OUT   NUMBER,
   plan_table      IN    VARCHAR2 DEFAULT NULL);

2. table cost:
DBMS_SPACE.CREATE_TABLE_COST (
   tablespace_name    IN VARCHAR2,
   avg_row_size       IN NUMBER,
   row_count          IN NUMBER,
   pct_free           IN NUMBER,
   used_bytes         OUT NUMBER,
   alloc_bytes        OUT NUMBER);

DBMS_SPACE.CREATE_TABLE_COST (
   tablespace_name    IN VARCHAR2,
   colinfos           IN  CREATE_TABLE_COST_COLUMNS,
   row_count          IN NUMBER,
   pct_free           IN NUMBER,
   used_bytes         OUT NUMBER,
   alloc_bytes        OUT NUMBER);

CREATE TYPE create_table_cost_colinfo IS OBJECT (
   COL_TYPE   VARCHAR(200),
   COL_SIZE   NUMBER);
type create_table_cost_columns is varray(50000) of create_table_cost_colinfo;

The used_bytes represent the actual bytes used by the data. This includes the overhead due to the block metadata, pctfree etc.
The alloc_bytes represent the size of the table when it is created in the tablespace. This takes into account, the size of the extents in the tablespace and tablespace extent management properties.

set serveroutput on 
DECLARE 
 ub NUMBER; 
 ab NUMBER; 
 cl sys.create_table_cost_columns; 
BEGIN 
  cl := sys.create_table_cost_columns( sys.create_table_cost_colinfo('NUMBER',10), 
        sys.create_table_cost_colinfo('VARCHAR2',30), 
        sys.create_table_cost_colinfo('VARCHAR2',30), 
        sys.create_table_cost_colinfo('DATE',NULL)); 
 
  DBMS_SPACE.CREATE_TABLE_COST('SYSTEM',cl,100000,0,ub,ab); 
 
  DBMS_OUTPUT.PUT_LINE('Used Bytes: ' || TO_CHAR(ub)); 
  DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab)); 
END; 

3. 数据增长趋势:
DBMS_SPACE.OBJECT_GROWTH_TREND (
   object_owner           IN    VARCHAR2,
   object_name            IN    VARCHAR2,
   object_type            IN    VARCHAR2,
   partition_name         IN    VARCHAR2 DEFAULT NULL,
   start_time             IN    TIMESTAMP DEFAULT NULL,      ----依赖统计数据的开始时间
   end_time               IN    TIMESTAMP DEFAULT NULL,    ---依赖统计数据的结束时间
   interval               IN    DSINTERVAL_UNCONSTRAINED DEFAULT NULL,    --The interval at which to sample
   skip_interpolated      IN    VARCHAR2 DEFAULT 'FALSE',    --Whether interpolation of missing values should be skipped
   timeout_seconds        IN    NUMBER DEFAULT NULL,    --The time-out value for the function in seconds
   single_datapoint_flag  IN    VARCHAR2 DEFAULT 'TRUE')     --Whether in the absence of statistics the segment should be sampled
 RETURN object_growth_trend_table PIPELINED;  

TYPE object_growth_trend_row IS RECORD(
   timepoint      TIMESTAMP,
   space_usage    NUMBER,
   space_alloc    NUMBER,
   quality        VARCHAR(20)); 
TYPE object_growth_trend_table IS TABLE OF object_growth_trend_row;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(二)SPACE USAGE

1. 查询MSSM表空间segment freelist上的free blocks
variable free_blocks number; 
exec DBMS_SPACE.FREE_BLOCKS(segment_owner=>'SCOTT', segment_name=>'CLUS', segment_type=>'CLUSTER', freelist_group_id=>3, partition_name=>'p1', free_blks=>:free_blocks); 
print free_blocks;

2. 查询ASSM表空间segment:
1) The first form of the procedure shows the space usage of data blocks under the segment High Water Mark. 
   You can calculate usage for LOBs, LOB PARTITIONS and LOB SUBPARTITIONS. 
   This procedure can only be used on tablespaces that are created with auto segment space management. 
   The bitmap blocks, segment header, and extent map blocks are not accounted for by this procedure. Note that this overload cannot be used on SECUREFILE LOBs.
   For LOB segments, the number of blocks that is returned from full_blocks and unformatted_blocks is actually the number of chunks for the LOB segment.

DBMS_SPACE.SPACE_USAGE(
   segment_owner           IN  VARCHAR2,
   segment_name            IN  VARCHAR2,
   segment_type            IN  VARCHAR2,
   unformatted_blocks      OUT NUMBER,     --For LOB segments, the number of blocks that is returned from unformatted_blocks is actually the number of chunks for the LOB segment.
   unformatted_bytes       OUT NUMBER,
   fs1_blocks              OUT NUMBER,    --Number of blocks having at least 0 to 25% free space
   fs1_bytes               OUT NUMBER,
   fs2_blocks              OUT NUMBER,    --Number of blocks having at least 25 to 50% free space
   fs2_bytes               OUT NUMBER,
   fs3_blocks              OUT NUMBER,    --Number of blocks having at least 50 to 75% free space
   fs3_bytes               OUT NUMBER,
   fs4_blocks              OUT NUMBER,    --Number of blocks having at least 75 to 100% free space
   fs4_bytes               OUT NUMBER,
   full_blocks             OUT NUMBER,    --The number of blocks that is returned from full_blocks is actually the number of chunks for the LOB segment
   full_bytes              OUT NUMBER,
   partition_name          IN  VARCHAR2 DEFAULT NULL); 

EXAMPLE:
variable unf number; 
variable unfb number; 
variable fs1 number; 
variable fs1b number; 
variable fs2 number; 
variable fs2b number; 
variable fs3 number; 
variable fs3b number; 
variable fs4 number; 
variable fs4b number; 
variable full number; 
variable fullb number; 
begin 
dbms_space.space_usage('U1','T', 
                        'TABLE', 
                        :unf, :unfb, 
                        :fs1, :fs1b, 
                        :fs2, :fs2b, 
                        :fs3, :fs3b, 
                        :fs4, :fs4b, 
                        :full, :fullb); 
end; 

print unf ; 
print unfb ; 
print fs4 ; 
print fs4b; 
print fs3 ; 
print fs3b; 
print fs2 ; 
print fs2b; 
print fs1 ; 
print fs1b; 
print full; 
print fullb; 

2) The second form of the procedure returns information about SECUREFILE LOB space usage. 
    It will return the amount of space in blocks being used by all the SECUREFILE LOBs in the LOB segment. 
    The procedure displays the space actively used by the LOB column, freed space that has retention expired, and freed space that has retention unexpired. 
    Note that this overload can be used only on SECUREFILE LOBs.

DBMS_SPACE.SPACE_USAGE(
   segment_owner           IN    VARCHAR2,
   segment_name            IN    VARCHAR2,
   segment_type            IN    VARCHAR2,
   segment_size_blocks     OUT   NUMBER,    --Number of blocks allocated to the segment
   segment_size_bytes      OUT   NUMBER,
   used_blocks             OUT   NUMBER,        --Number blocks allocated to the LOB that contains active data
   used_bytes              OUT   NUMBER,
   expired_blocks          OUT   NUMBER,        --Number of expired blocks used by the LOB to keep version data
   expired_bytes           OUT   NUMBER,
   unexpired_blocks        OUT   NUMBER,    --Number of unexpired blocks used by the LOB to keep version data
   unexpired_bytes         OUT   NUMBER,
   partition_name          IN    VARCHAR2 DEFAULT NULL);


3. 查询unused blocks

DBMS_SPACE.UNUSED_SPACE (
   segment_owner              IN  VARCHAR2, 
   segment_name               IN  VARCHAR2,
   segment_type               IN  VARCHAR2,
   total_blocks               OUT NUMBER,        --Returns total number of blocks in the segment
   total_bytes                OUT NUMBER,
   unused_blocks              OUT NUMBER,        --Returns number of blocks which are not used
   unused_bytes               OUT NUMBER,
   last_used_extent_file_id   OUT NUMBER,    --Returns the file ID of the last extent which contains data
   last_used_extent_block_id  OUT NUMBER,    --Returns the starting block ID of the last extent which contains data
   last_used_block            OUT NUMBER,     --Returns the last block within this extent which contains data
   partition_name             IN  VARCHAR2 DEFAULT NULL);


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(三)DEPENDENT

返回对象的dependent object
DBMS_SPACE.OBJECT_DEPENDENT_SEGMENTS(
   objowner    IN     VARCHAR2,
   objname     IN     VARCHAR2,
   partname    IN     VARCHAR2,    ---partition_name
   objtype     IN     NUMBER) 
   RETURN dependent_segments_table PIPELINED; 

TYPE object_dependent_segment IS RECORD (
   segment_owner      VARCHAR2(100),
   segment_name       VARCHAR2(100),
   segment_type       VARCHAR2(100),
   tablespace_name    VARCHAR2(100),
   partition_name     VARCHAR2(100),
   lob_column_name    VARCHAR2(100)); 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(四)自定义函数方便查询
效果:
SQL> set serveroutput on
SQL> exec show_space('T1');
Unformatted Blocks .....................               0
FS1 Blocks (0-25)  .....................               0
FS2 Blocks (25-50) .....................               0
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................               0
Full Blocks        .....................           1,419
Total Blocks............................           1,536
Total Bytes.............................      12,582,912
Total MBytes............................              12
Unused Blocks...........................              85
Unused Bytes............................         696,320
Last Used Ext FileId....................               7
Last Used Ext BlockId...................           1,664
Last Used Block.........................              43


set define off
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 that 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 a 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.segment_type = :p_type
              and seg.tablespace_name = ts.tablespace_name'
             into l_segment_space_mgmt
            using p_segname, p_partition, p_partition, p_owner, p_type;
   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;
/
set define on


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle的sysaux表空间满了,需要进行清理或扩容操作。可以通过以下步骤进行处理: 1. 查看sysaux表空间的使用情况,确定是否需要扩容或清理。 2. 如果需要扩容,可以使用ALTER TABLESPACE命令进行扩容操作。 3. 如果需要清理,可以使用以下命令进行清理: a. 执行DBMS_SPACE_ADMIN.TABLESPACE_MOVER.PROCEDURE_MOVE_TABLESPACE将表移动到其他表空间。 b. 执行DBMS_SPACE_ADMIN.TABLESPACE_MOVER.PROCEDURE_MOVE_TABLESPACE将索引移动到其他表空间。 c. 执行DBMS_SPACE_ADMIN.TABLESPACE_MOVER.PROCEDURE_MOVE_TABLESPACE将LOB对象移动到其他表空间。 d. 执行DBMS_SPACE_ADMIN.TABLESPACE_MOVER.PROCEDURE_MOVE_TABLESPACE将对象移动到其他表空间。 e. 执行DBMS_SPACE_ADMIN.TABLESPACE_MOVER.PROCEDURE_MOVE_TABLESPACE将对象移动到其他表空间。 f. 执行DBMS_SPACE_ADMIN.TABLESPACE_MOVER.PROCEDURE_MOVE_TABLESPACE将对象移动到其他表空间。 4. 清理完成后,可以再次查看sysaux表空间的使用情况,确保已经解决问题。 ### 回答2: Oracle数据库中的SYSAUX表空间是用于管理和存储系统级别的关键性能数据的空间。当该表空间满时,可能会导致数据库性能下降或无法正常工作。那么,我们该如何处理这种情况呢? 首先,我们可以通过查询V$SYSAUX_OCCUPANTS视图来确定哪些对象占用了SYSAUX表空间,并分析这些占用情况。通过该视图,我们可以得知哪些对象是占用空间比较大的,可以采取针对性的对其进行管理和优化,比如移除或重建该对象。 其次,我们可以通过执行自动维护任务来释放SYSAUX表空间中不必要的数据。Oracle自动在SYSAUX表空间中创建了若干个自动维护任务,这些任务定时执行清理、移除或归档等操作,可以释放出一定的空间。我们可以通过查询DBA_AUTOTASK_CLIENT视图来查看自动维护任务的设置情况,并可以修改或禁用不必要的任务来释放更多的空间。 另外,我们可以考虑对SYSAUX表空间进行扩展,以增加其存储容量。在扩展SYSAUX表空间时,我们需要确保数据文件存储在一个有效的磁盘位置,并要注意数据文件的分布和扩展方式。在扩展完毕后,我们需要重新分配表空间数据文件中的数据块,并重新计算表和索引的size,以保证数据结构的正确性和性能的稳定性。 综上所述,当SYSAUX表空间满了时,我们不必过于紧张,可以通过几种方式来解决问题。同时,我们也需要定期对数据库进行管理和优化,在日常运维过程中及时排查各种问题,以避免出现系统崩溃、数据丢失等问题。 ### 回答3: Oracle中的sysaux表空间是用来存储系统级别的常用数据和信息的,包括一些企业管理以及可选组件等等,通常占据大量的空间。当sysaux表空间满了时,会对数据库的正常运行造成重大影响,因此需要及时处理。 当sysaux表空间满了,我们可以采取以下措施: 1. 压缩sysaux表空间:对sysaux表空间中的数据进行压缩,从而减小该表空间的大小。可以使用Oracle提供的压缩工具或第三方工具来实现。 2. 重新分配sysaux表空间大小:通过修改数据库参数或使用Oracle提供的ALTER TABLESPACE命令进行重新分配表空间大小,以便更好地管理数据库空间,并解决sysaux表空间满的问题。 3. 清理和删除不必要的信息:可以通过查询sysaux表空间中的数据来确定哪些信息已过时或不再需要。然后,将这些信息清理并从sysaux表空间中删除,进一步减小表空间的大小。 总之,当Oracle中的sysaux表空间满了时,需要针对具体情况采取相应的措施来解决问题。在处理sysaux表空间的问题时,需慎重行事,以免影响整个数据库的正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值