oracle - 为什么我的表大小比 avg_row_len 的预期大近 10 倍?

标签 oracle

在我的 Oracle 数据库中,我有一个大小为 3.44 GB 的表。它是 1784486 行,450146 行,对应于 8 kB 的块大小,平均每块 4 行,或每行 2 kB。但是 AVG_ROW_LEN 只有 369 个字节。造成差异的原因是什么?

更多细节:

PCT_FREE 只有 10,所以不应该负责。压缩目前已关闭。表格布局是(列名概括)

KEY            NUMBER(38)           NOT NULL,
DATE1          DATE                 NOT NULL,
DATE2          DATE                 NOT NULL,
POINT          NUMBER(4)            NOT NULL,
NAME           VARCHAR2(200 BYTE)   NOT NULL,
BLOB_SIZE      NUMBER(38)           NOT NULL,
BLOB_TYPE      VARCHAR2(8 BYTE)     NOT NULL,
BLOB_FILTERS   VARCHAR2(64 BYTE)    NOT NULL,
BLOB_DATA      BLOB                 NOT NULL,
PRECOMPUTED    RAW(2000)    -- currently no more than ~200 bytes
                            -- (15 doubles, plus some headers)

最佳答案

好的。让我们先弄清楚 TOAD 在哪里获取您正在查看的数字

有什么作用

SELECT sum(bytes)/1024/1024/1024 size_in_gb,
       sum(blocks) size_in_blocks
  FROM dba_segments
 WHERE owner = <<owner of table>>
   AND segment_name = <<name of table>>

返回表的大小?

有什么作用
SELECT num_rows, blocks, empty_blocks, avg_row_len, last_analyzed
  FROM all_tables
 WHERE owner = <<owner of table>>
   AND table_name = <<name of table>>

返回表上的统计信息?

有什么作用
SELECT COUNT(*)
  FROM <<owner of table>>.<<name of table>>

返回表中的实际行数?

有什么作用
DECLARE
  l_unformatted_blocks number;
  l_unformatted_bytes number;
  l_fs1_blocks number;
  l_fs1_bytes number;
  l_fs2_blocks number;
  l_fs2_bytes number;
  l_fs3_blocks number;
  l_fs3_bytes number;
  l_fs4_blocks number;
  l_fs4_bytes number;
  l_full_blocks number;
  l_full_bytes number;
BEGIN
  dbms_space.space_usage (<<table owner>>, <<table name>>, 'TABLE',
                          l_unformatted_blocks, l_unformatted_bytes,
                          l_fs1_blocks, l_fs1_bytes, l_fs2_blocks, l_fs2_bytes,
                          l_fs3_blocks, l_fs3_bytes, l_fs4_blocks, l_fs4_bytes,
                          l_full_blocks, l_full_bytes);
  dbms_output.put_line('Unformatted Blocks = '||l_unformatted_blocks);
  dbms_output.put_line('FS1 Blocks = '||l_fs1_blocks);
  dbms_output.put_line('FS2 Blocks = '||l_fs2_blocks);
  dbms_output.put_line('FS3 Blocks = '||l_fs3_blocks);
  dbms_output.put_line('FS4 Blocks = '||l_fs4_blocks);
  dbms_output.put_line('Full Blocks = '||l_full_blocks);
END;

显示如何使用表中的块?

是否在 1 月 14 日 14:02:29 之后更新了行?特别是,是否有可能插入了一些相对较小的行,但随后被更新为更大的行?如果您重新收集表格上的统计信息,是否会发生任何变化
BEGIN
  dbms_stats.gather_table_stats( ownname          => <<owner of table>>,
                                 tabname          => <<name of table>>,
                                 estimate_percent => null,
                                 granularity      => 'ALL' );
END;

关于oracle - 为什么我的表大小比 avg_row_len 的预期大近 10 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9537826/

相关文章:

java - 从数据库 SQL oracle 保存和获取 blob 时出错

sql - Oracle 12.2 中使用 BIND 变量和 OR 条件的 QUERY 的性能问题

java - JPA/hibernate : Map many-to-many relationship when join table has own primary key

oracle - 如何从 Pl/SQL 中的存储函数返回临时 CLOB 实例?

sql - 选择连接两个表 Oracle PL/SQL

ruby-on-rails - 如何动态设置模型的表名?

java - 在 Wildfly 上部署 : ClassNotFoundException: Oracle12cDialect

oracle - 创建 Oracle 存储过程并从 .sql 文件执行它

sql - 如何在单个 SQL 语句中两次使用 GROUP BY 语句?

sql - 为什么不能在 OUTER JOIN 操作中使用 OR 或 IN?