前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个删除数据的trick

一个删除数据的trick

作者头像
bisal
发布2022-09-26 10:45:23
2100
发布2022-09-26 10:45:23
举报
文章被收录于专栏:bisal的个人杂货铺

碰巧看到朋友圈提的一个问题,一张测试表,装载了10万的数据,

代码语言:javascript
复制
SQL> create table test(id number, c1 varchar2(30));
Table created.


SQL> select count(*) from test;
  COUNT(*)
----------
    100000

开启允许行迁移,删除了所有数据,同时执行了shrink space操作,想的是可以主动做空间回收,

代码语言:javascript
复制
SQL> alter table test enable row movement;
Table altered.


SQL> delete from test;
100000 rows deleted.


SQL> commit;
Commit complete.


SQL> alter table test shrink space;
Table altered.

但是检索这张表的统计信息,发现数据块、行数仍然是删除之前的状态,

代码语言:javascript
复制
SQL> exec print_table('select table_name, blocks, empty_blocks, num_rows from user_tables where table_name = ''TEST''');
TABLE_NAME                    : TEST
BLOCKS                        : 622
EMPTY_BLOCKS                  : 0
NUM_ROWS                      : 100000
-----------------
PL/SQL procedure successfully completed.

按说确实删除了数据,而且执行了shrink,应该回收了空间,但是统计信息跟我们反馈的是相反的,这是什么原因?

可能一些有经验的朋友看到这,应该能猜到问题是什么了。

Oracle的统计信息,有自动和手工两种更新方式,"自动"更新统计信息,一种是指某些操作执行完成,会触发统计信息的采集,例如创建索引,另外一种是数据库中通过window和job配合执行的一个定时任务,执行时间在不同的版本可能有所不同,例如11g,工作日从22:00开始做统计信息的更新采集。"手动"更新统计信息就是通过dbms_stats包各种gather_*存储过程,进行统计信息的采集。

如上问题中,显然是可能没到自动采集统计信息的时间点,同时没执行手工采集统计信息的操作,可以验证,如上删除了所有的数据,接着执行,

代码语言:javascript
复制
SQL> exec dbms_stats.gather_table_stats('BISAL','TEST');
PL/SQL procedure successfully completed.

此时就可以看到统计信息显示数据都是空的了,

代码语言:javascript
复制
SQL> exec print_table('select table_name, blocks, empty_blocks, num_rows from user_tables where table_name = ''TEST''');
TABLE_NAME                    : TEST
BLOCKS                        : 1
EMPTY_BLOCKS                  : 0
NUM_ROWS                      : 0
-----------------
PL/SQL procedure successfully completed.

刚才提到的某些操作会自动触发统计信息的采集,至于原因,可以参考《表和索引统计信息自动采集的问题》和《truncate表,会将统计信息清除么?》等历史文章。

实践是检验真理的唯一标准,当我们对某个现象不很确定的时候,动手操作一下,很可能就会让你印象深刻,除此之外,知其然更要知其所以然,能让你得到更多的经验。

这些都是前辈们为我们证明过的、屡试不爽的,但是真轮到我们自己,就可能因为惰性,有所裁减,建议还是要坚持,一起共勉了。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,

161e6be5245b4c2dfa3ece8e75293c36.png
161e6be5245b4c2dfa3ece8e75293c36.png

近期更新的文章:

最近碰到的一些问题

让你的sqlplus支持历史指令的快速检索

什么是红圈所?

MySQL相同执行计划,为何有执行快慢的差别?

最近碰到的一些问题

近期的热文:

"红警"游戏开源代码带给我们的震撼

文章分类和索引:

公众号1000篇文章分类和索引

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/08/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档