点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!
概念
逻辑删除:逻辑删除并不是真正的删除,而是将表中列所对应的状态字段(status)做修改操作,实际上并未删除目标列数据或恢复这些列占用的磁盘空间。比如0是未删除,1是删除。在逻辑上数据是被删除了,但是数据本身还在数据库中,只是不进行对外提供了,逻辑删除的本质是修改操作(将is_delete的值进行0和1之间的修改)。
例如:电脑的回收站使用的原理就是逻辑删除。删除的文件进入回收站的本质只是在操作系统的帮助下对文件加上了某种标记,资源管理器对这种含有标记的文件不显示。当回收站恢复的时候,即移除这种标记。当清空回收站的时候进行的是物理删除。一般的商城网站使用的是逻辑删除来操作数据库。
物理删除:使用delete、truncate、drop语句删除数据,物理删除就是把数据从硬盘中删除,释放空间,缩小体积,对性能的提升有帮助
II.缺点
物理删除是从根源上面删除,几乎无法恢复数据
物理删除会造成主键不连续,分页查询数据慢
III. 应用的地方
核心的业务表不用物理查询
实操
仍然使用之前建立的数据表进行测试,直达链接:Oracle中新建数据表的两种方法(单击进入文章)
逻辑删除语法:
--逻辑删除单列alter table table_name set unused (column_name) ONLINE; --加上ONLINE,业务不阻塞--逻辑删除多列alter table table_name set unused (column_name1, column_name2);--注意:set unused 语句是不可逆的操作,意思就是不能进行recover,除非你有备份。
例如:现在,逻辑删除数据表JT_CS.STUINFO_01里的ENROLDATE、CLASSNO两列字段和单独删除一个字段ENROLDATE。
原始数据

--逻辑删除一列alter table JT_CS.STUINFO_01 set unused (ENROLDATE) ONLINE;--逻辑删除两列alter table JT_CS.STUINFO_01 set unused (CLASSNO, ENROLDATE);
可以从DBA_UNUSED_COL_TABS
视图查看每个表中未使用的列的数量:
select * from DBA_UNUSED_COL_TABS;

完成此操作后,再次查询表JT_CS.STUINFO_01将不再看到刚刚逻辑删除的列。如果以后有时间物理删除列,可以使用以下方法完成,语法如下:
--语句是对未使用的列唯一允许的操作。它从表中物理删除未使用的列并回收磁盘空间。alter table table_name drop unused columns ONLINE ;--该子句导致在处理指定数量的行后应用检查点,在本例中为 1000。--检查点减少了删除列操作期间累积的undo日志量,以避免undo空间的潜在耗尽。alter table table_name drop unused columns checkpoint XX;
物理删除语法:
--物理删除单列alter table table_name drop column column_name;--物理删除多列alter table table_name drop (column_name1, column_name2);
例如:现在,我要物理删除数据表JT_CS.STUINFO_01里的SEX、AGE两列字段和单独删除一个字段IDNUMBER。
原始数据

--物理删除单列alter table JT_CS.STUINFO_01 drop column IDNUMBER;--物理删除多列alter table JT_CS.STUINFO_01 drop (SEX, AGE);
现在我们来查下DBA_UNUSED_COL_TABS视图,看下刚刚逻辑删除未使用的列还存在吗?
经查询,逻辑删除未使用的列已经不存在,空结果集。
结论:从表中物理删除一列将导致该表中所有未使用的列同时被删除(即有set unused 的列将被删除)。
注意:大表一般不用这种方法删除,对业务影响太严重,在及时性要求不高的情况下,小表可以这么操作。

点击关注“SQL数据库运维”,后台或浏览至公众号文章底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。
动动小手点击加关注呦☟☟☟




