暂无图片
如何查看表的碎片率,并回收空闲空间
我来答
分享
C+1
2023-09-14
如何查看表的碎片率,并回收空闲空间

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
dbaking

1.计算表的碎片情况

  • 查看某个用户下表的碎片情况,查询信息的准确性依赖于统计信息的准确性,并不能反映表的碎片率。
set lines 199 pagesize 199 set COLSEP '|' select d.owner, d.table_name, round((d.blocks * 8) / 1024, 2) "allocated MB", round((d.num_rows * d.avg_row_len / 1024 / 1024), 2) "used MB", round((d.blocks * 10 / 100) * 8 / 1024, 2) "reserved(d.pct_free) MB", round((d.blocks * 8 - (d.num_rows * d.avg_row_len / 1024) -d.blocks * 8 * 10 / 100) / 1024,2) "waste_MB" from dba_tables d where d.blocks * 8 / 1024 > 10 -- and d.owner = 'SCOTT' order by 6 desc;
复制
  • 使用脚本时替换上面注释掉的条件
OWNER |TABLE_NAME |allocated MB| used MB|reserved(d.pct_free) MB| waste_MB --------|---------------|------------|----------|-----------------------|---------- SYS |IDL_UB1$ | 266.02| .9| 26.6| 238.52 SYS |IDL_UB2$ | 30.66| .28| 3.07| 27.32 SYS |COLLECTION$ | 23.27| .07| 2.33| 20.87 SYS |TYPE$ | 23.27| .22| 2.33| 20.72 SYS |ATTRIBUTE$ | 23.27| .73| 2.33| 20.21 SYS |RESULT$ | 18.03| .13| 1.8| 16.1 SYS |METHOD$ | 18.03| .18| 1.8| 16.05 SYS |PARAMETER$ | 18.03| .69| 1.8| 15.54 SYS |JAVA$MC$ | 12.15| .09| 1.21| 10.85 SYS |VIEWTRCOL$ | 11.15| 0| 1.11| 10.03 SYS |OPQTYPE$ | 11.15| .01| 1.11| 10.03
复制

输出项说明如下:

"allocated MB" 代表实际的大小 "used MB" 真正使用的大小 "reserved(d.pct_free) MB" 代表保留的大小,一般都是默认10% "waste_MB" 代表浪费的空间
复制

如果想查看具体某张表的碎片情况,可以把where条件中的OWNER='SCOTT’换成table_name='表名’。

2.处理表空间的碎片问题

可以通过以下几种方式回收表的空闲空间。

第一种方式

alter table scott.emp move; exec dbms_stats.gather_table_stats(ownname => 'SCOTT',tabname => 'EMP')
复制
  • EMP换成需要回收的表名字
  • 回收之后需要重新收集表的统计信息,统计信息的收集方式可以参考
  • 统计信息收集完成之后,可以重启再重新检查一遍表碎片情况

第二种方式

alter table emp enable row movement; alter table emp shrink space cascade; alter table emp disable row movement; exec dbms_stats.gather_table_stats(ownname => 'SCOTT',tabname => 'EMP')
复制
  • EMP换成需要回收的表名字
  • 回收之后需要重新收集表的统计信息,统计信息的收集方式可以参考
  • 统计信息收集完成之后,可以重启再重新检查一遍表碎片情况

第三种方式

可以通过ctas的方式,重建碎片率高的表,如果创建过程中,源表有记录更改,那么数据可能存在不准确的情况

create table emp_temp as select * from emp;
复制
暂无图片 评论
暂无图片 有用 0
打赏 0
暂无图片
回答交流
Markdown


请输入正文
提交
相关推荐
PL/SQL语法问题
回答 2
已采纳
业务模拟程序1,每0.1秒执行一次插入,并记录日志表declarelcntinteger;lvarvarchar2(2000);beginforiin1..10000loopbegininsertin
ORA-00600
回答 3
ORA600是Oracle数据库的一个错误代码,通常表示数据库遇到了一个严重的内部错误。ORA600错误通常与数据库的内部操作有关,可能是由于软件缺陷、硬件故障或配置错误等原因引起的。通常是bug引起
oracle 19.3升级到19.20 单实例
回答 5
已采纳
路径写错了吧/home/oracle/app//两个/了?
客户反馈有一个Oracle数据库,12月19日开始,22:00~22:30时间段内感觉响应很慢
回答 4
墨天轮有分析工具 https://www.modb.pro/awr自己上传分析就好了
Oracle 11.2.0.4 impdp导入时报错
回答 1
impdpCCENSE/CCENSE,impdp后用户如果写成system/password会怎样?172.16.233.11:1521/bdbus指向的是本地的库么?你是在目标主机上运行导入的么?
请问如何分辨某个用户是从哪台机器登陆 ORACLE 的?
回答 2
已采纳
 SELECTmachine,terminalFROMV$SESSION;可以通过这个语句查一下
Oracle中function和procedure的区别描述正确的是?
回答 1
已采纳
ABCDOracle中function和procedure的区别?1).可以理解函数是存储过程的一种 2).函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值&nb
oracle迁移数据库到kingbase 0x00报错
回答 2
确定非法UTF8数据的位置:SELECT FROMyourtable WHEREUTLRAW.CASTTORAW(textcolumn)LIKE'%'||UTLRAW.CASTTO
Oracle中,如果没有赋予用户任何profile,将发生什么情况?
回答 6
已采纳
createuser语句中即使没有赋予用户任何profile,oracle后台也会默认给用户赋予DEFAULT的profile的。
oracle 内存结构- private sql area
回答 1
已采纳
我的理解:privatesqlarea存在于PGA中,每个会话都有各自的privatesqlarea。其作用主要是两个:1、保存执行中的SQL使用到的绑定变量的值。2、运行中的SQL的状态信息。lib