千家信息网

dba_tables中的avg_row_len是如何被计算的

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,今天就跟大家聊聊有关dba_tables中的avg_row_len是如何被计算的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。收集信息时avg
千家信息网最后更新 2025年12月02日dba_tables中的avg_row_len是如何被计算的

今天就跟大家聊聊有关dba_tables中的avg_row_len是如何被计算的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

收集信息时avg_row_len被计算,使用analyze 和dbms_stats搜集时计算avg_row_len的差别在于后者不考虑row header占用的3个byte

doc如下:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/schema.htm#sthref720

C:>sqlplus xys/manager

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 10月 8 22:10:18 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> desc tab1;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------

ID NUMBER(38)
NAME VARCHAR2(10)
TIME DATE

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
16

SQL> SELECT *FROM TAB1;

ID NAME TIME
---------- ---------- --------------
1 a 08-10月-07

SQL> insert into tab1 values(2,null , sysdate);

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
15

SQL> select * from tab1;

ID NAME TIME
---------- ---------- --------------
1 a 08-10月-07
2 08-10月-07
--这里的3是row header占用的byte,1代表的是The column length requires 1 byte for columns that store 250 bytes or less

SQL> select 3+vsize(id)+1+vsize(name)+1+vsize(time)+1 from tab1;

3+VSIZE(ID)+1+VSIZE(NAME)+1+VSIZE(TIME)+1
-----------------------------------------
16


SQL> select 3+vsize(id)+1+nvl(vsize(name),0)+1+vsize(time)+1 from tab1;

3+VSIZE(ID)+1+NVL(VSIZE(NAME),0)+1+VSIZE(TIME)+1
------------------------------------------------
16
15

SQL> truncate table tab1;

表被截断。

SQL> insert into tab1 values(2,null , sysdate);

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
15
--如果是null的话而且不在末尾,也就是不是最后一个字段,那么只有column len占用一个字节
SQL> select 3+vsize(id)+1+nvl(vsize(name),0)+1+vsize(time)+1 from tab1;

3+VSIZE(ID)+1+NVL(VSIZE(NAME),0)+1+VSIZE(TIME)+1
------------------------------------------------
15

SQL> truncate table tab1;

表被截断。

SQL> insert into tab1 values(2,'a',null);

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
8

SQL> select * from tab1;

ID NAME TIME
---------- ---------- --------------
2 a
--如果最后的字段是null的话,那么column len也不占用字节,也就是doc上提到的for trailing null columns Oracle does not even store the column length.
前几天还看到有人问什么是"trailing null columns",biti大师做了回答
SQL> select 3+vsize(id)+1+vsize(name)+1 from tab1;

3+VSIZE(ID)+1+VSIZE(NAME)+1
---------------------------
8

SQL> alter table tab1 add col1 varchar2(300);

表已更改。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
8

SQL> update tab1 set col1=rpad('a' , 249);

已更新 1 行。

SQL> commit;

提交完成。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
259

SQL> select id , name , time , substr(col1 , 1 , 1) from tab1;

ID NAME TIME SU
---------- ---------- -------------- --
2 a a

SQL> select 3+vsize(id)+1+vsize(name)+1+nvl(vsize(time),0)+1+1+vsize(col1) from
tab1;

3+VSIZE(ID)+1+VSIZE(NAME)+1+NVL(VSIZE(TIME),0)+1+1+VSIZE(COL1)
--------------------------------------------------------------
259

SQL> update tab1 set col1=rpad('a' , 250);

已更新 1 行。

SQL> commit;

提交完成。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
260

SQL> select 3+vsize(id)+1+vsize(name)+1+nvl(vsize(time),0)+1+1+vsize(col1) from
tab1;

3+VSIZE(ID)+1+VSIZE(NAME)+1+NVL(VSIZE(TIME),0)+1+1+VSIZE(COL1)
--------------------------------------------------------------
260
--The column length requires 1 byte for columns that store 250 bytes or less, or 3 bytes for columns that store more than 250 bytes
当列上的值超过250的时候,column len要求3个byte
SQL> update tab1 set col1=rpad('a' , 251);

已更新 1 行。

SQL> commit;

提交完成。

SQL> analyze table tab1 compute statistics;

表已分析。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
263

SQL> select 3+vsize(id)+1+vsize(name)+1+nvl(vsize(time),0)+1+1+vsize(col1) from
tab1;

3+VSIZE(ID)+1+VSIZE(NAME)+1+NVL(VSIZE(TIME),0)+1+1+VSIZE(COL1)
--------------------------------------------------------------
261

SQL> select 3+vsize(id)+1+vsize(name)+1+nvl(vsize(time),0)+1+3+vsize(col1) from
tab1;

3+VSIZE(ID)+1+VSIZE(NAME)+1+NVL(VSIZE(TIME),0)+1+3+VSIZE(COL1)
--------------------------------------------------------------
263
--==============================================================================
使用dbms_stats收集statistics情况会有所不同,计算avg_row_len时row header不被计算
SQL> truncate table tab1;

表被截断。

SQL> desc tab1;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------

ID NUMBER(38)
NAME VARCHAR2(10)
TIME DATE
COL1 VARCHAR2(300)

SQL> insert into tab1(id , name) values(1 , 'a');

已创建 1 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats('xys' , 'tab1');

PL/SQL 过程已成功完成。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
6

SQL> select vsize(id)+1+vsize(name)+1 from tab1;

VSIZE(ID)+1+VSIZE(NAME)+1
-------------------------
5

SQL> update tab1 set time=sysdate;

已更新 1 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats('xys' , 'tab1');

PL/SQL 过程已成功完成。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
13

SQL> select vsize(id)+1+vsize(name)+1+vsize(time)+1 from tab1;

VSIZE(ID)+1+VSIZE(NAME)+1+VSIZE(TIME)+1
---------------------------------------
13

SQL> update tab1 set col1=rpad('a',249);

已更新 1 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats('xys' , 'tab1');

PL/SQL 过程已成功完成。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
263

SQL> select vsize(id)+1+vsize(name)+1+vsize(time)+1+vsize(col1)+1 from tab1;

VSIZE(ID)+1+VSIZE(NAME)+1+VSIZE(TIME)+1+VSIZE(COL1)+1
-----------------------------------------------------
263

SQL> update tab1 set col1=rpad('a',250);

已更新 1 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats('xys' , 'tab1');

PL/SQL 过程已成功完成。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
264

SQL> select vsize(id)+1+vsize(name)+1+vsize(time)+1+vsize(col1)+1 from tab1;

VSIZE(ID)+1+VSIZE(NAME)+1+VSIZE(TIME)+1+VSIZE(COL1)+1
-----------------------------------------------------
264

SQL> update tab1 set col1=rpad('a',251);

已更新 1 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats('xys' , 'tab1');

PL/SQL 过程已成功完成。

SQL> select avg_row_len from user_tables where table_name='TAB1';

AVG_ROW_LEN
-----------
265

SQL> select vsize(id)+1+vsize(name)+1+vsize(time)+1+vsize(col1)+1 from tab1;

VSIZE(ID)+1+VSIZE(NAME)+1+VSIZE(TIME)+1+VSIZE(COL1)+1
-----------------------------------------------------
265

SQL>

看完上述内容,你们对dba_tables中的avg_row_len是如何被计算的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

分析 更新 成功 过程 内容 也就是 名称 字段 字节 类型 不同 代表 信息 只有 大师 差别 情况 时候 星期 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 知网本科生论文查重数据库有哪些 计算机网络技术考研难么 软件开发二期补充协议 梅州广播电视台网络安全 网络产品服务应当符合网络安全 强制删除软件开发 用香港服务器违法吗算翻墙吗 数据库查询主要功能有哪些 网络安全执法检查自查表 适合兼职的软件开发 政务网络技术发展趋势 众生元网络技术有限公司 浙江大学高级数据库技术 网络安全部署会主持词 广州紫鲸网络技术有限公司 宁波数据网络技术包括什么 长沙辰运软件开发加班多么 盐城浪潮服务器供应商 银川互联网科技发展 网络安全不忘初心主题教育 重庆惠普服务器维修虚拟主机 金铲铲之战服务器都满了怎么办 机械软件开发和硬件开发哪个好 bscode设置数据库 网络安全上方四十七条 高中网络技术应用学业水平试题 乌镇互联网医院是哪家科技公司 全省农商银行网络安全培训 江西专业软件开发服务以客为尊 服务器的电源模块可以测电压吗
0