Oracle表碎片整理操作步骤详解

高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink space碎片整理功能。对于索引,可以采取rebuild online的方式进行碎片整理,一般来说,经常进行DML操作的对象DBA要定期进行维护,同时注意要及时更新统计信息!

一:准备测试数据,使用HR用户,创建T1表,插入约30W的数据,并根据object_id创建普通索引,表占存储空间34M

SQL> conn /as sysdba

已连接。

SQL> select default_tablespace from dba_users where username='HR';

DEFAULT_TABLESPACE

------------------------------------------------------------

USERS

SQL> conn hr/hr

已连接。

SQL> insert into t1 select * from t1;

已创建 74812 行。

SQL> insert into t1 select * from t1;

已创建 149624 行。

SQL> commit;

提交完成。

SQL> create index idx_t1_id on t1(object_id);

索引已创建。

SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);

PL/SQL 过程已成功完成。

SQL> select count(1) from t1;

COUNT(1)

----------

299248

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='T1';

SUM(BYTES)/1024/1024

--------------------

34.0625

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='IDX_T1_ID';

SUM(BYTES)/1024/1024

--------------------

6

二:估算表在高水位线下还有多少空间可用,这个值应当越低越好,表使用率越接近高水位线,全表扫描所做的无用功也就越少!

DBMS_STATS包无法获取EMPTY_BLOCKS统计信息,所以需要用analyze命令再收集一次统计信息

SQL> SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1';

BLOCKS EMPTY_BLOCKS   NUM_ROWS

---------- ------------ ----------

4302            0     299248

SQL> analyze table t1 compute statistics;

表已分析。

SQL> SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1';

BLOCKS EMPTY_BLOCKS   NUM_ROWS

---------- ------------ ----------

4302           50     299248

SQL> col table_name for a20

SQL> SELECT TABLE_NAME,

2         (BLOCKS * 8192 / 1024 / 1024) -

3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"

4    FROM USER_TABLES

5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB

-------------------- -------------------------

T1                                  5.07086182

三: 查看执行计划,全表扫描大概需要消耗CPU 1175

SQL> explain plan for select * from t1;

已解释。

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 3617692013

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |   299K|    28M|  1175   (1)| 00:00:15 |

|   1 |  TABLE ACCESS FULL| T1   |   299K|    28M|  1175   (1)| 00:00:15 |

--------------------------------------------------------------------------

四:删除大部分数据,收集统计信息,全表扫描依然需要消耗CPU 1168

SQL> delete from t1 where object_id>100;

已删除298852行。

SQL> commit;

提交完成。

SQL> select count(*) from t1;

COUNT(*)

----------

396

SQL>  exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);

PL/SQL 过程已成功完成。

SQL> analyze table t1 compute statistics;

表已分析。

SQL> SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1';

BLOCKS EMPTY_BLOCKS   NUM_ROWS

---------- ------------ ----------

4302           50        396

SQL> explain plan for select * from t1;

已解释。

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------

Plan hash value: 3617692013

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |   396 | 29700 |  1168   (1)| 00:00:15 |

|   1 |  TABLE ACCESS FULL| T1   |   396 | 29700 |  1168   (1)| 00:00:15 |

--------------------------------------------------------------------------

五:估算表在高水位线下还有多少空间是无数据的,但在全表扫描时又需要做无用功的数据

SQL> SELECT TABLE_NAME,

2         (BLOCKS * 8192 / 1024 / 1024) -

3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"

4    FROM USER_TABLES

5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB

-------------------- -------------------------

T1                                  33.5791626

六:对表进行碎片整理,重新收集统计信息

SQL> alter table t1 enable row movement;

表已更改。

SQL> alter table t1 shrink space cascade;

表已更改。

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='T1';

SUM(BYTES)/1024/1024

--------------------

.125

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='IDX_T1_ID

';

SUM(BYTES)/1024/1024

--------------------

.0625

SQL> SELECT TABLE_NAME,

2         (BLOCKS * 8192 / 1024 / 1024) -

3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"

4    FROM USER_TABLES

5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB

-------------------- -------------------------

T1                                  33.5791626

SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);

PL/SQL 过程已成功完成。

这个时候,只剩下0.1M的无用功了,执行计划中,全表扫描也只需要消耗CPU 3

SQL> SELECT TABLE_NAME,

2         (BLOCKS * 8192 / 1024 / 1024) -

3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"

4    FROM USER_TABLES

5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB

-------------------- -------------------------

T1                                  .010738373

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 3617692013

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |   396 | 29700 |     3   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| T1   |   396 | 29700 |     3   (0)| 00:00:01 |

--------------------------------------------------------------------------

总共只有5个块,空块却有50个,明显empty_blocks信息过期

SQL> select blocks,empty_blocks,num_rows from user_tables where table_name='T1';

BLOCKS EMPTY_BLOCKS   NUM_ROWS

---------- ------------ ----------

5           50        396

SQL> analyze table t1 compute statistics;

表已分析。

SQL> select blocks,empty_blocks,num_rows from user_tables where table_name='T1';

BLOCKS EMPTY_BLOCKS   NUM_ROWS

---------- ------------ ----------

5            3        396

相关阅读:

c++验证哥德巴赫猜想

对学Oracle数据库初学者的开场篇

基于Android实现3D翻页效果

Android列表对话框用法实例分析

在C语言中转换时间的基本方法介绍

脚本合并提升javascript性能示例

jquery获取复选框被选中的值

详解:一张桌面看懂Win10 11个新特性

win10预览版修改注册表后无法升级解决办法

分享下Asp.Net面试题目及答案集合

java中文乱码之解决URL中文乱码问题的方法

HTML语法大全_html语言语法大全(必看)

iOS中UIWebView网页加载组件的基础及使用技巧实例

s:set 和 s:date 使用, 在jsp判断日期

oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...相关推荐

  1. ios php 表单提交图片上传,axios发送post请求提交图片表单步骤详解

    这次给大家带来axios发送post请求提交图片表单步骤详解,axios发送post请求提交图片表单的注意事项有哪些,下面就是实战案例,一起来看一下. DOME 接口const userUploadA ...

  2. oracle通过dblink连接mysql配置详解(全Windows下)

    oracle通过dblink连接mysql配置详解(全Windows下) 关于oracle通过dblink连接mysql,经过了两周的空闲时间研究学习,终于配置好了,真是不容易啊,仔细想想的话,其实也 ...

  3. oracle加密传输的种子,oracle net manager 数据传输安全步骤详解

    简介 Net Manger可以管理服务命名和监听程序. 所谓监听程序就是一个Oracle服务器上进程,负责监听/响应客户端对Oracle服务的请求.之前我们在安装数据库实例时,同时已经安装了一个监听程 ...

  4. 抢鲜体验:Oracle 19C单实例数据库安装步骤详解

    抢鲜体验:Oracle 19C单实例数据库安装步骤详解 原创: 李宏达 数据和云 今天 作者:李宏达,云和恩墨北区交付工程师. 大家一直期待的 Oracle Database 19c 今天已经提供公开 ...

  5. Linux系统安装oracle客户端步骤详解

    Linux系统安装oracle客户端步骤详解 项目需要在linux系统上安装oracle客户端访问windows下安装的数据库,所以写了这篇文章,在安装时候搜索了很多博客,但是我发现大部分都是有问题的 ...

  6. 2.6顺序表和链表的优缺点(区别、特点)详解

    顺序表和链表由于存储结构上的差异,导致它们具有不同的特点,适用于不同的场景.本节就来分析它们的特点,让读者明白 "在什么样的场景中使用哪种存储结构" 更能有效解决问题. 通过系统地 ...

  7. easycode 表配置_idea的easyCode的 MybatisPlus模板的配置详解

    EasyCode 插件 EasyCode 插件 是一款根据表结构生成代码的很方便的Idea插件, 强烈推荐. 并且可以自定义模板来控制生成的类 我在使用的过程中发现一些问题,现在把解决办法记录下来, ...

  8. python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)

    链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...

  9. 计算机碎片整理,计算机磁盘碎片整理

    出国留学网小编为你整理"2017计算机资格WindowsXP考点磁盘碎片整理"哦,介绍了WindowsXP等相关内试题,欢迎广大网友前来学习,希望对你有所帮助!更多资讯关注本网站的 ...

最新文章

  1. H5小游戏 - canvas涂鸦板
  2. 深度学习优化算法大全系列3:NAG(Nesterov Acceleration Gradient)
  3. 无继承情况下的对象构造
  4. 模拟退火算法介绍和实例实现
  5. Java安全生态-Java加解密API详解-Java安全框架官方文档翻译:对称/非对称加密、数字签名、数字证书、安全通信、密钥库等
  6. 芭比Q了,腰间盘给整突出了
  7. vue项目中如何解决跨域问题
  8. Halcon区域region系列(1)相关的算子
  9. UE4中实现鼠标单选空间中的模型、Ctrl键多选、空间打点框选功能。
  10. 【整理】轴体结构和润轴
  11. windows操作系统杂谈
  12. 元宇宙基础-Three.js | 大帅老猿threejs特训营
  13. 拉钩网前端项目实战04
  14. CityMaker学习教程13 osg模型的移动
  15. 计算机专业期末背书,每到期末,我就后悔读了这个专业
  16. mysql查找操作返回值出现 - [User{id=1, userName='null', date=Sun Sep 16 00:00:00 CST 2018}]
  17. 帮派红包 概率_电子游戏如何教我关于连锁帮派
  18. ERROR 1226 (42000):User 'root' has exceeded the 'max_questions' resource (current value: 2)
  19. PS常见问题03——如何绘制水平、竖直及45°直线
  20. Boyd Corporation宣布其南亚工厂获得ISO 13485:2016认证

热门文章

  1. 设计数据密集型应用—— 数据系统的未来(12 下)
  2. 余情未了用计算机弹,2018年职称计算机考试题库(7)
  3. (ECCV-2020)超越部分模型。用细粒度的部分池化进行行人检索(和一个强大的卷积基线)
  4. 系统架构设计师软件生命周期_云架构师生命中的一天
  5. js 将时间戳转化为小时分钟
  6. I.MX6U-系统移植-3-uboot启动流程
  7. python编写一个端口扫描器
  8. linux vim set ff,Linux命令:vi | vim命令
  9. 读软件架构师应该知道的97件事的自己理解
  10. 【HTTP 404 - 指定されたURLは見つかりません。】错误及解决