Oracle数据库新建索引,重建索引和大表,收缩表,降低表空间使用率和磁盘使用空间

1. Oracle建索引

--对于新表,直接新建即可
create  index 客户报价表_IX1 on TAB_客户报价表 (客户编号) tablespace E3_INDX; 

--对于已经有数据的表,尤其是大表,选择在线并行,新建索引
-- Create/Recreate indexes 
create  index 客户报价表_IX1 on TAB_客户报价表 (客户编号) online parallel 4 nologging tablespace E3_INDX; --在线建索引
------关闭并行。
alter index 客户报价表_IX1 noparallel;

2. 重建索引

在实际生产环境中,由于磁盘空间是有限的,数据文件不可能无限增加,经常遇到数据库表空间不足,磁盘空间不足的情况,此时一般可以这样处理,通过删除数据,然后通过重建索引的方式来降低表空间使用率。如果没有删除过数据,此方法效果很小!
当然如果不能删除数据,大概率只能增加磁盘!
下面是重建索引的方式:

2.1 先查询数据库中表和索引的大小

--查询当前用户下,表的大小
select sEGMENT_name, bytES / 1024 / 1024 / 1024
  FROM User_Segments
 where segment_type = 'TABLE'
 order by  bytES / 1024 / 1024 / 1024 desc

--查询当前用户下,索引的大小
select sEGMENT_name, bytES / 1024 / 1024 / 1024
  FROM User_Segments
 where segment_type = 'INDEX'
 order by bytES / 1024 / 1024 / 1024 desc

创建表时怎么创建索引mysql 建表时建立索引_sql


创建表时怎么创建索引mysql 建表时建立索引_oracle_02

2.2 重建索引查询

----重建索引
select 'alter index '||segment_name ||
       ' rebuild online parallel 4  tablespace e3_indx;'
  from user_segments
 where tablespace_name = 'E3_DATA'
 and segment_type='INDEX'
   and bytes/1024/1024 >1000 
   and bytes/1024/1024 <5000
-- 此sql是将目前在e3_data表空间大于1G小于5G的索引,重建到e3_indx,此方法会降低e3_data使用率,增加e3_indx的使用率。
-- 还有其他几种方式,例如将e3_indx表空间的索引重建到e3_indx,此方法需要根据实际情况自行调整。

重建索引前,务必确认剩余空间是否足够,另外如果索引特别大,需要关注undotbs表空间和临时表空间的大小

创建表时怎么创建索引mysql 建表时建立索引_oracle_03

2.3 实际执行语句

--开启并行重建
alter index 客户报价表_IX1 rebuild online parallel 4  tablespace e3_indx;
--关闭并行
alter index 客户报价表_IX1 noparallel;

2.4 查看索引重建进度,仅供参考

select sid,                 /* Session ID */
       opname as 操作内容,              /*  操作内容   */
       target as 相关表,
       round(sofar/totalwork*100) as 完成百分比, /*+ 完成百分比 */
       elapsed_seconds  as 已执行时间,     /*已经执行的时间*/
       time_remaining as 剩余时间      /* 预计剩余时间 */
from v$session_longops
where time_remaining !=0

3.重建大表

此方法是替换大表,将原表数据导出后,删除原表,新建表的方式,可大幅降低表空间使用率
务必先导出备份,不到万不得已,不使用

alter table E3_LOG rename to E3_LOG_BAK;
alter table E3_LOG1 rename to E3_LOG;
drop  table E3_LOG_BAK;

4. 收缩表

此方法在删除数据后,效果很明显,对于大表,需要关注undotbs表空间和临时表空间的大小

alter table E3_LOG  enable row movement; --启动行移动功能
alter table E3_LOG  shrink space cascade;--收缩表,降低高水位线,并且相关索引也要收缩一下
alter table E3_LOG  disable row movement;--关闭行移动

5.重建索引后,查看磁盘空间是否可调整

此方法是重新调整数据文件的大小,来调整磁盘空间的使用率。请根据实际情况调整!

-- 先查询可调整的数据文件
SELECT
   a.file_id,
   a.file_name
   file_name,
   CEIL( ( NVL( hwm,1 ) * blksize ) / 1024 / 1024 ) smallest,
   CEIL( blocks * blksize / 1024 / 1024 ) currsize,
   CEIL( blocks * blksize / 1024 / 1024 ) -
   CEIL( ( NVL( hwm,1) * blksize ) / 1024 / 1024 ) savings,
   'alter database datafile ''' || file_name || ''' resize ' ||
   CEIL( ( NVL( hwm,1) * blksize ) / 1024 / 1024 )  || 'm;' cmd
FROM
   DBA_DATA_FILES a,
   (
      SELECT   file_id, MAX( block_id + blocks - 1 ) hwm
      FROM     DBA_EXTENTS
      GROUP BY file_id
   ) b,
   (
      SELECT  TO_NUMBER( value ) blksize
      FROM    V$PARAMETER
      WHERE   name = 'db_block_size'
   )
WHERE
   a.file_id = b.file_id(+)
AND
   CEIL( blocks * blksize / 1024 / 1024 ) - CEIL( ( NVL( hwm, 1 ) * blksize ) / 1024 / 1024 ) > 0

ORDER BY 5 desc

创建表时怎么创建索引mysql 建表时建立索引_数据库_04

alter database datafile '/u02/oradata/orcl/e3_data93.dbf' resize 1793m;