oracle数据库批量删除(delete)数据后,表空间不是立刻释放问题解决

解决办法

当我们在手动清理(delete)一张表里面的废数据时,数据库并不会立刻废数据的表空间,这样在我们系统的查询时会有性能影响。
我们可以通过手动触发表分析的方式,释放被删除的废数据所占用的表空间,提示性能。
触发方法如下:

begin
	dbms_stats.gather_table_stats('schema','table_name')
end;

注意:替换sql中的表用户与表名

问题原因分析

oracle会维护数据库中所有表的一些信息:

  • 行数(Num Rows)

  • 表块数(Blocks)

  • 行长(Avg Row Len)

  • 列的信息:不同值的数量(NDV)、空值数量、数据分布(直方图)

  • 索引的信息:聚类因子、索引层级、叶块数量

当我们手动删除完一批数据后,oracle没有准确的统计信息,执行查询sql时,优化器就像在“盲猜”,很可能选择全表扫描而不是索引扫描,或者使用低效的表连接方式,导致 SQL 性能极差。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐