(转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化
硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放。
【delete后用:alter table table_name move truncate后用:alter table table_name deallocate unused 均不可解决】
解决方法:
--delete/truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化汇总
--查询DBF文件、数据库空间、高水位线占用情况
select /*+ ordered use_hash(a,b,c) */
a.file_id,
a.file_name,
a.tablespace_name,
a.filesize,
b.freesize,
(a.filesize - b.freesize) usedsize,--使用空间
c.hwmsize,
c.hwmsize - (a.filesize - b.freesize) unsedsize_belowhwm,--未使用空间
a.filesize - c.hwmsize canshrinksize--文件大小
from (select tablespace_name,file_id, file_name, round(bytes / 1024 / 1024) filesize
from dba_data_files) a,
(select file_id, round(sum(dfs.bytes) / 1024 / 1024) freesize
from dba_free_space dfs
group by file_id) b,
(select file_id, round(max(block_id) * 8 / 1024) HWMsize--高水位线
from dba_extents
group by file_id) c
where a.file_id = b.file_id
and a.file_id = c.file_id
order by unsedsize_belowhwm desc
--查询【各用户】【表空间】数据存储空间占用大小(用户与表空间对应关系)
select owner,tablespace_name ,sum(bytes)/1024/1024 from dba_segments group by owner,tablespace_name
--查询当前用户【表】数据存储空间占用大小
select segment_name, bytes/1024/1024
from user_segments
where segment_type = 'TABLE';
--查询当前用户【所有对象】数据存储空间占用大小
select segment_type, Segment_Name, Sum(bytes) / 1024 / 1024
From User_Extents
Group By Segment_Name, segment_type
--查询【表空间】与【DBF】对应关系与存储情况
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
--删除表数据
truncate table ZW_FZHSZD
TRUNCATE TABLE JC_ASSETS_ADD --DROP STORAGE
--分析(不分析,会导致下面步骤查询表的高水位线时候数值会不准)
ANALYZE TABLE ZW_FZHSZD ESTIMATE STATISTICS;
--查询表的水位分配情况
SELECT blocks, empty_blocks, num_rows
FROM user_tables
WHERE table_name = 'ZW_FZHSZD';
--TRUNCATE后可释放表数据库空间,表默认把TRUNCATE数据前的空间大小作为初始空间大小,表的高水位线不会降低,需要Shring收缩表的大小(下面详解)后方可降低表的水位线
--释放/收缩表数据库空间
--alter table tablename move --选择性操作,delete后可通过此方法释放数据库空间,但此操作MOVE时需要双倍的表空间,大表有可能会导致高水位线提高,而且如果表上有索引的
话,需要重构索引,不建议使用
alter table tablename deallocate unused keep 0;--成功释放数据库空间,但高水位线不降低(表的高水位线降低,表空间的不降低??) alter table JC_ASSETS_CHANGE enable row movement;--开启movement功能
alter index xx rebuild--movement后需要重建索引(未验证可行性)
ALTER TABLE USERS SHRINK SPACE --cascade --成功收缩表的数据库空间为最小值,但【表空间】水位有时降低、有时不降低,原因不详
--回缩索引为最小值(选择性操作)
ALTER INDEX INDEXINDEX1_FZHSZD SHRINK SPACE
--查询最大可resize空间
select a.file#,
a.name,
a.bytes / 1024 / 1024 CurrentMB,
ceil(HWM * a.block_size / 1024 / 1024) Resizeto,
(a.bytes - HWM * a.block_size) / 1024 / 1024 releaseMB,
'alter database datafile ''' || a.name || ''' resize ' ||
ceil(HWM * a.block_size / 1024 / 1024) || 'M;' ResizeCmd
from v$datafile a,
(select file_id, max(block_id + blocks - 1) HWM
from dba_extents
group by file_id) b
where a.file# = b.file_id(+)
and (a.bytes - HWM * a.block_size) > 0
order by 5
--Resize释放硬盘空间(resize值必须大于高水位线,所以降低水位线非常重要)
ALTER DATABASE DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' resize 1000M;
--释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置.
Alter table table_name deallocate unused
终极方法:把表空间A内所有对象(表、索引)移动到表空间B,然后Resize 表空间A为最少值(表空间内所有对象移走后高水位线会降到最低),然后再把对象从表空间B移回表空间A(测试可用,但不知道有没副作用)
PS:
【清理临时表空间方法】
ALTER TABLESPACE 临时表空间名 SHRINK SPACE KEEP 512M
EMP:ALTER TABLESPACE TEMP_FMMS2 SHRINK SPACE KEEP 512M
--表空间DBF文件大小
select bytes/1024/1024 free_size from dba_data_files where tablespace_name='USERS';
--表空间空闲空间
select SUM(BYTES/1024/1024) total_size from dba_free_space where tablespace_name='USERS';
--表空间水位线
select max(block_id)*8/1024 "m size" from dba_extents where tablespace_name='USERS'
(转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化的更多相关文章
- INITIAL参数设置导致TRUNCATE TABLE不能降低高水位线案例
在一个数据库使用下面SQL找出了一批需要降低高水位线的表,其中有几个表没有数据,于是我打算用TRUNCATE来降低高水位线HWM SELECT a.owner, a.segment_na ...
- oracle优化:避免全表扫描(高水位线)
如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...
- 【重新挂载磁盘空间】Linux系统/home的磁盘空间重新挂载给/root
以下是在centos7版本上做测试 使用如下命令查看磁盘使用情况 ls -lh 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9 ...
- AUL恢复truncate删除的表
背景 接到用户申告,新毕业的兄弟不小心把数据库中的3个关键表给truncate了,由于这个业务还在测试阶段,系统没有任何形式的备份. 客户的OS平台是windows平台,数据库是Oracle9207 ...
- Oracle 高水位说明和释放表空间,加快表的查询速度
高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表 ...
- Oracle 执行报错表空间或临时表空间不足,降低水位线方法
Oracle 执行语句插入临时表报表空间不足,在增加表空间到最大后依然报错,经分析应该为创建的临时表水位线未清除导致,查询降低水位线方法如下: 原文地址:http://blog.itpub.net/2 ...
- mysql----快速删除数据表(drop,truncate.delete)
概念: 三者均可删除数据表 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...
- 为什么delete后磁盘空间没有释放而truncate会释放?
背景 因项目需求,需要清理一批旧数据,腾出空间给新数据,让同事负责这件事.料想会很顺利,但很快找到我,并告知在postgresql中把一张大的数据表删除掉了,查询表的size并没有改变. 我震惊了,问 ...
- mysql使用硬链接配合truncate 删除2.2T的表 --杨奇龙
http://blog.csdn.net/wyzxg/article/details/8626814 http://blog.itpub.net/22664653/viewspace-750408/ ...
随机推荐
- Win10卸载预装应用
Win10的预装应用大多数都比较鸡肋,没啥用,喜欢纯净的系统的朋友可以将其卸载掉. 1.以管理员身份启动powershell,键入命令[Get-AppxPackage | Select Name, P ...
- tensorflow service部署
tensorflow+tensorflow-serving+docker+grpc模型上线部署(不需bazel编译,有代码)[https://blog.csdn.net/u013714645/arti ...
- VS2017 中安装SVN
VS2017 中安装SVN 1.下载:SVN For Vs2017 2.安装: 先关闭VS2017,找到下载文件,直接双击,安装. 3.启用插件 打开Vs2017,直接可用.
- Kettle使用教程之安装与资源库的创建
1.安装JDK 本人使用的JDK版本是1.8,且必须要在系统的环境变量添加路径. 2.下载Kettle 目前稳定的版本是8.2,但是本人使用的是7.1版本,其下载的URL为:https://sourc ...
- Delphi实现带有格式的Excel导出功能
功能预览 运行预览 模板样式 存储返参 导出的Excel 2. 代码实现 //执行sql的函数 procedure TForm1.GetReportData(astrsql:string); var ...
- gitlab中的CI
https://blog.csdn.net/chengzi_comm/article/details/78778284
- 英特尔® Open Image Denoise 库有助于节省时间,提高质量
在使用光线跟踪增强真实性与沉浸感时,游戏开发人员面临复杂的权衡.为了克服一系列挑战,英特尔创建了使用光线跟踪进行图像渲染的一整套解决方案,包含高性能开源滤波器.该解决方案已发布测试版,被集成至 Uni ...
- 【Qt开发】QScrollArea添加布局后没有出现滚动条的解决方法
[Qt开发]QScrollArea添加布局后没有出现滚动条的解决方法 标签:[Qt开发] 说明:尝试利用滚动区域显示多张图片,为了能够动态地往滚动区域贴图,为滚动区域设置了布局,然后通过布局来添加wi ...
- 【Qt开发】QImage设置为8-bit灰度图
项目中用到大量基础图像处理知识,其中灰度图的生成是很重要的一环. 先补充一些基础知识: -------------------------------------------------------- ...
- CF486B OR in Matrix(构造+思维)
CF486B 一道有趣的思维题 由于or的性质可知只要a[i][j]为1那么b中第i行,第j列将都变成1 相反的,如果b[i][j]是0那么a中第i行,第j列都必须是0 根据第二个性质我们可以构造出a ...