如何确定非分区表高水位虚高

如何确定非分区表高水位虚高:

一般认为分配给表使用的数据块空间远大于表实际占用存储空间时,我们就认为表的高水位虚高,涉及该表的查询sql存在不必要的消耗,需要进行优化。

通过比较数据占用和分配数据块的空间比对来确定哪些表的高水位虚高:

sys用户执行(如果数据库支持statistics_level配置,一般9.2之后都支持):

SQL>exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO();

再执行:

SELECT a.owner || ‘.‘ || a.table_name "Table",

a.num_rows,

a.avg_row_len,

b.inserts,

b.deletes,

a.num_rows + nvl(b.inserts, 0) - nvl(b.deletes, 0) total_rows,

round(a.avg_row_len *(a.num_rows + nvl(b.inserts, 0) - nvl(b.deletes, 0)) / 1024 / 1024,4) "Calculate_Sizle(Mb)估算的大小",

c.bytes / 1024 / 1024 "Segment_Size(Mb)段大小",

(a.avg_row_len * (a.num_rows + nvl(b.inserts, 0) - nvl(b.deletes, 0))) /c.bytes "使用率"

FROM dba_tables a

LEFT JOIN all_tab_modifications b

ON a.owner = b.table_owner

AND a.table_name = b.table_name

INNER JOIN dba_segments c ON a.owner = c.owner

AND a.table_name = c.segment_name

WHERE a.last_analyzed IS NOT NULL

AND a.partitioned = ‘NO‘

--AND b.deletes
> 0

AND a.owner LIKE ‘%DLP114_SXU01%‘

AND a.table_name LIKE ‘DEBUG_MSG‘

--AND c.bytes /
1024 / 1024 > 100

--AND (a.avg_row_len * (a.num_rows + nvl(b.inserts, 0) - nvl(b.deletes, 0))) / c.bytes
< 0.3

ORDER BY b.deletes DESC;

注意: 如果数据库不支持statistics_level配置的话,请使用数据库用户对表单独执行ANALYZE后查看。

Sql中关键条件说明:

avg_row_len * (a.num_rows + nvl(b.inserts, 0) - nvl(b.deletes, 0))) /
c.bytes < 0.3:表单条数据的平均占用空间*当前数据条数=表数据理论占用数据块大小,c.byte是表实际占用的数据块大小。用这两个比率来分析出表占用的数据块的实际使用率。

c.bytes / 1024 / 1024 > 100:表实际占用数据块大小,对于表实际占用很小的表来说,认为消耗是可以接受的,可以认为不具优化价值,可以选择忽略这些表的虚高。

时间: 2024-10-15 21:13:06

如何确定非分区表高水位虚高的相关文章

Oracle高水位High Water Mark(HWM)简介

1.什么是高水位 高水位是Oracle中使用和未使用空间中的边界线,也可以理解为数据文间和非数据文间的分界线,但是这里的数据文件指代的是存储过数据的数据文件,而非仅仅是数据表中有数据的数据文件. 2.高水位对于检索的影响 假设我们有个表有2百万行数据存储在几个区中,假如我们删除一百万条数据.尽管数据区中的数据没有了,但是Oracle中占用的区的数据空间仍然不变,与原来二百万条数据占用的数据空间是一样的.当我们在数据库中执行查询时,Oracle仍会遍历所有的数据块,即便这些数据块中没有数据.从这个

用Delete与Truncate清除表数据对高水位的影响

众所周知,oracle段都有一个在段内容纳数据块的上限,我们把这个上限称为"High Water Mark"(HWM).这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment.原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值.HWM就像一个水库的历史最高水位,这也是为何会称之为"高水位"的缘故.实际环境中随着我们表中数据的不断增长,表的高水位也被不断的推高.当高水位达到一定程度之后,会对该表上的SQL查询效率产生负

Oracle 高水位(HWM)回收原理及操作方法

一.  高水位(HWM)及其产生原因 High Water Mark,HWM) 是Oracle(Segment)级别的概念.在仅有DML(比如delete,insert)操作时,高水位线只会增长,不会降低.具体来说,由于程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位. 下图为一个Segment内高水位不断增长的示意图: 注:一个表在初次插入记录时,Oracle会为其分配Segment和block. 插入大量数据后,高水位线随之增长 当数据

Oracle move和shrink释放高水位空间 (一)

move 和shrink 的共同点 1.收缩段 2.消除部分行迁移 3.消除空间碎片 4.使数据更紧密 一.shrink 语法: alter table TABLE_NAME shrink space [compact|cascate] segment shrink执行的两个阶段: 1.数据重组(compact): 通过一系列insert.delete操作,将数据尽量排列在段的前面.在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁. 由于涉及到rowid的改变,需要enable row

Oracle—deallocate unused释放高水位空间(二)

deallocate unused :仅适用于释放HWM高水位以上的空间,而无法释放高水位以下的空间:比如对表预分配的空间 使用说明和方法,官方文档有说明,如下: Use the deallocate_unused_clause to explicitly deallocate unused space at the end of a database object segment and make the space available for other segments in the ta

oralce move和shrink释放高水位

转自:https://blog.51cto.com/fengfeng688/1955137 move和shrink的共同点: 收缩段,消除部分行迁移,消除空间碎片,使数据更紧密 shrink用法: 语法: alter table TABLE_NAME shrink space [compact|cascades] shrink分为以下两个阶段: 1.数据重组(compact) 通过一系列的insert,delete操作,将数据尽量排列在段的前面.在这个过程中,需要在表上面加RX锁,即只在需要移动

Oracle 12.2新特性----在线把非分区表转为分区表

在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1.建好分区表然后insert into select 把数据插入到分区表中:2.使用在线重定义(DBMS_REDEFINITION)的方法.它们的币是:第一种方法,如果对表有频繁的DML操作,尤其是update操作,就需要停业务来做转换.第二种方法可以在线进行操作,不需要停业务,但操作步骤比较复杂,且可能出错. Oracle12cR2版本中提供了一种新特性,一条语句就可以把非分区表转换为分区表,语法如下: ALT

源码-020501-自定义非等高cell-storyboard

// // XMGStatusesViewController.m // 备课03-不等高的cell-非代码 #import "XMGStatusesViewController.h" #import "XMGStatus.h" #import "XMGStatusCell.h" @interface XMGStatusesViewController () @property (strong, nonatomic) NSArray *statu

非分区表的重组

项目的数据过多的占用系统表空间后会造成系统的效率降低,影响系统 的性能.如果数据库对象占用系统表空间过大就需要移动该对象到指定的项目数据表空间.可以在不运行emp或者imp程序的情况下移动一个非分区表.移动非分区表时可以修改表的存储参数,这被用于移动一个表从一个表空间到另一个表空间或者重组表以消除数据行的迁移. 当一个非分区表被重组时表的结构被保存但是该表上的所有的索引都失效必须重建索引,尤其是primary key index. 一.移动占用system表空间容量过大的数据库对象(表段) 1.