`

oracle move表释放空间

 
阅读更多

 场景:

定时任务查询一张表速度超级慢,delete很多记录之后数据还是很慢

,加上索引之后依旧慢。

执行方法:

 

alter table T_DMS_04 move
 tablespace JAC_PCL_DATA;

 参考文档:======================

 

有好多时候,表经过大量的DML操作后,高水线也会升高,在delete后高水位线还是没下来,

也就是说,数据是删除了,但空间并没有释放,这时候我们可以用alter table move的方法

使空间释放,但曾有一次,对表进行MOVE后,空间还是没有释放,

下面我就把解决过程模拟一下,就知道之所在了

 

 

--看一下下面两张表的大小
SQL> select SEGMENT_NAME,BYTES/1024/1024 M from user_segments 
where SEGMENT_NAME like 'TEST_TB%';
SEGMENT_NAME                  M
-------------------- ----------
TEST_TB1                   1088
TEST_TB2                   1088
--查看记录数
SQL> select count(*) from TEST_TB1;
  COUNT(*)
----------
         0
SQL> select count(*) from TEST_TB2;
  COUNT(*)
----------
         0
--可以看到两张表均为空表,现在对两张表都进行move操作
SQL> alter table TEST_TB2 move;
Table altered.
SQL> alter table TEST_TB1 move;
Table altered.
--再看两张表所占用的空间
SQL> select SEGMENT_NAME,BYTES/1024/1024 M from user_segments 
where SEGMENT_NAME like 'TEST_TB%';
SEGMENT_NAME                  M
-------------------- ----------
TEST_TB1                   1024
TEST_TB2                  .0625
--为什么会这样,我们想到了空间分配问题,于是查看两表的DDL语句
SQL> set long 20000
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','TEST_TB2') 
FROM USER_TABLES;
DBMS_METADATA.GET_DDL('TABLE','TEST_TB2')
-----------------------------------------------------------
  CREATE TABLE "LZDYXIN"."TEST_TB2"
   (    "ID" NUMBER,
        "NAME" VARCHAR2(30)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "LZDYXIN"
 
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','TEST_TB1') FROM USER_TABLES;
DBMS_METADATA.GET_DDL('TABLE','TEST_TB1')
-----------------------------------------------------------------------
  CREATE TABLE "LZDYXIN"."TEST_TB1"
   (    "ID" NUMBER,
        "NAME" VARCHAR2(30)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 1073741824 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "LZDYXIN"

 由上面的DDL发现,Test_tb1的INITIAL 1073741824,可以看出move减少空间时不会

小于表的初始扩展,所以我们可以在move时重新指定表的INITIAL参数

SQL> alter table TEST_TB1 move storage(initial 64K);
 Table altered.
SQL> col SEGMENT_NAME format a20
SQL> select SEGMENT_NAME,BYTES/1024/1024 M from user_segments 
where SEGMENT_NAME like 'TEST_TB%';
SEGMENT_NAME                  M
-------------------- ----------
TEST_TB1                  .0625
TEST_TB2                  .0625
--查看一个表所占的空间大小:
SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.* 
FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME='JK_TEST';
--查看一个表空间所占的实际大小:
SELECT SUM(BYTES) / 1024 / 1024 ||'MB' 
FROM USER_SEGMENTS U  WHERE TABLESPACE_NAME = 'DATA01';
--查看一个表空间对应的数据文件:
SELECT * FROM DBA_DATA_FILES D 
WHERE D.TABLESPACE_NAME = 'DATA01';
--查看表空间的使用情况:
SELECT A.TABLESPACE_NAME,      
       FILENUM,   
       TOTAL "TOTAL (MB)",  
       F.FREE "FREE (MB)",
       TO_CHAR(ROUND(FREE * 100 / TOTAL, 2), '990.00') "FREE%", 
       TO_CHAR(ROUND((TOTAL - FREE) * 100 / TOTAL, 2), '990.00') "USED%",    
       ROUND(MAXSIZES, 2) "MAX (MB)"
  FROM (SELECT TABLESPACE_NAME,          
               COUNT(FILE_ID) FILENUM,        
               SUM(BYTES / (1024 * 1024)) TOTAL,          
               SUM(MAXBYTES) / 1024 / 1024 MAXSIZES      
          FROM DBA_DATA_FILES       
         GROUP BY TABLESPACE_NAME) A,     
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / (1024 * 1024))) FREE     
          FROM DBA_FREE_SPACE      
         GROUP BY TABLESPACE_NAME) F
 WHERE A.TABLESPACE_NAME = F.TABLESPACE_NAME
--查看数据文件的实际使用情况:
SELECT CEIL(MAX_BLOCK * BLOCK_SIZE / 1024)
  FROM (SELECT MAX(BLOCK_ID) MAX_BLOCK
          FROM DBA_EXTENTS
         WHERE FILE_ID IN (SELECT FILE_ID
                             FROM DBA_DATA_FILES D
                            WHERE D.TABLESPACE_NAME = 'USERS')) M,
       (SELECT VALUE / 1024 BLOCK_SIZE
          FROM V$PARAMETER
         WHERE NAME = 'db_block_size') B

  

http://blog.sina.com.cn/s/blog_62d1205301013cg7.html

 

分享到:
评论

相关推荐

    Oracle 表空间 收缩

    因此,如果直接尝试修改数据文件的大小,可能会导致数据丢失或者无法正确释放空间。 **解决方案**: 1. **确定最大block_id**:通过查询`dba_extents`视图找到当前表空间中最大的block_id,计算出该block_id对应的...

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    解决方法是缩小表空间,使用 alter table XXXX move 语句可以释放表空间。 2. 索引的无效:当释放表空间后,表的行号 rowid 会发生变化,而基于 rowid 的索引则会变成无效。解决方法是重建索引,使用 alter index ...

    ORACLE删除表空间会入到的问题及解决方案.zip_oracle_oracle 解决方案

    1. 使用`DROP TABLESPACE INCLUDING CONTENTS AND DATAFILES`:这个命令会删除表空间内的所有对象并释放数据文件。但请注意,这是不可逆的操作,数据将永久丢失。 2. 使用`DROP TABLESPACE CASCADE CONSTRAINTS`:...

    Oracle数据库的空间使用分析及其管理.pdf

    同时,及时清理无用的对象,如临时表、日志等,也能有效地释放空间。 在实际应用中,例如文中提到的基于Oracle9i的生产管理数据库系统,通过对数据库空间的监控、碎片分析和优化,可以提高系统的运行速度,确保生产...

    Oracle分区表学习及应用.doc

    - 更改分区的表空间:通过`ALTER TABLE [table_name] MOVE PARTITION`,可以将分区移动到另一个表空间,如`p_200409`移动到`TS_ZIKEN_01`。 7. 查询与操作特定分区: 可以直接针对分区执行查询和DML操作,如`SELECT...

    Oracle碎片整理

    `ALTER TABLE T MOVE`命令是Oracle中用于整理表空间的一种方法。当执行这个命令时,Oracle会创建一个新的表,将旧表的数据移动到新表中,然后删除旧表并重命名新表。这种方法可以有效地解决表的内部碎片问题,因为它...

    Oracle常用的和表(Table)相关的命令

    - `truncate table`: 删除表中的所有数据并释放空间。 #### 4.6 删除表(Drop Table) **命令格式**: ``` sql> drop table table_name [cascade constraints]; ``` **解析**: - `drop table`: 删除表。 - `cascade ...

    Oracle降低高水位的方法

    - **功能**:该命令可以直接清空表并释放空间,但需要注意的是,这会删除所有数据,并且无法通过事务回滚来恢复数据。 - **适用场景**:适用于不再需要表中现有数据的情况。 3. **使用`ALTER TABLE <table_name> ...

    oracle里常用命令之三

    本文将详细介绍Oracle中与表操作相关的常用命令,包括创建、复制、临时表、存储参数调整、空间分配、表移动、释放未使用空间、截断、删除以及修改列等操作。 1. 创建表 创建表是数据库设计的起点。使用`CREATE ...

    Oracle数据库性能优化(碎片整理)..docx

    同时,可以考虑建立更有效的备份和归档策略,将旧数据移动到归档表空间,释放主表空间。 另外,监控和调整表空间的自动段空间管理(ASSM)也是一个重要环节。ASSM使用位图自由列表来管理空闲空间,能有效减少碎片,...

    oracle 11g partitioning

    2. **删除分区(Drop Partition)**:当某些分区不再需要时,可以通过删除操作释放空间。 3. **移动分区(Move Partition)**:在不改变分区内容的情况下,将分区移动到其他位置以优化存储布局。 4. **重新组织分区...

    最全的oracle常用命令大全.txt

    2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滚段名称及大小 ...

    如何保持Oracle数据库优良性能

    MOVE PARTITION`可以在不同表空间之间移动分区。 - **修改分区**:使用`ALTER TABLE ... SPLIT PARTITION`来分裂一个分区成两个。 - **重命名分区**:通过`ALTER TABLE ... RENAME PARTITION`更改分区名称。 - **...

    oracle_10g数据库管理_应用开发_标准教程》课后习题答案.doc

    - `PCTUSED`:用于控制数据块删除时释放空间的比例。 7. **手动分配存储空间**: - 示例:`ALTER TABLE Student ALLOCATE EXTENT (SIZE 128K);` 这条语句为`Student`表手动分配一个大小为128KB的新盘区。 8. **...

    Oracle dbf文件移动的方法

    - 同时,注意审计文件(audit trail)也可能占用了大量空间,需要清理以释放空间。 2. **审计文件处理**: - 如果审计文件导致空间不足,可以先删除不再需要的审计日志,例如在/home/oracle/audit目录下。 - ...

    SharePlex实用文档与常见问题解决

    * Alter table move a new tablespace:Alter table move a new tablespace 命令用于修改表的表空间,优化表结构。 三、SharePlex AA 复制实施 SharePlex AA 复制实施是指使用 SharePlex 实现自动化的数据复制,...

    (重要)AIX command 使用总结.txt

    swapon -a //启动所有的分页空间 ##交换区命令end ##查看HACMP, 外部硬盘信息: lscfg -v lscfg -v | grep -E "pdisk|hdisk" //可查看已经加入到卷组中的磁盘的大小 ## lsdev命令start 常用参数说明: C ->列出...

Global site tag (gtag.js) - Google Analytics