暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 对小表的多块分配

askTom 2018-05-23
313

问题描述

嗨,

我在我的数据库上执行下面的查询,并找到给定的输出:

select a.table_name, a.NUM_ROWS, a.AVG_ROW_LEN, a.LAST_ANALYZED, a.SAMPLE_SIZE, a.blocks
from user_tables a
where num_rows <10;
复制


输出:

TABLE_NAME NUM_ROWS AVG_ROW_LEN LAST_ANALYZED SAMPLE_SIZE BLOCKS
EMPLOYEE_STATUS 1 32 05-May-18 1 4
EMPLOYEE_CITY 6 36 05-May-18 6 4
复制



考虑到每个块大小为8k字节,当我们在表中有非常少量的数据时,可能是多块分配的可能原因 (除了碎片)。另外,我如何将此块分配减少到最小。

提前谢谢。

专家解答

在为表分配空间时,Oracle数据库不会一次执行一个块。相反,它分配了一个范围。这是一组连续的数据块。

第一个范围的大小由表空间的初始大小决定:

select initial_extent from dba_tablespaces
where  tablespace_name = 'USERS';

INITIAL_EXTENT   
           65536 

create table t (
  x int, stuff varchar2(100) default lpad('x', 100, 'x')
) tablespace users ;
insert into t values (1, default);
commit;

select blocks, bytes from user_extents
where  segment_name = 'T';

BLOCKS   BYTES   
       8   65536 
复制


现在,是否使用这些块是另一回事。这取决于您过去在其上运行的DML和DDL语句。

例如,如果您在表中插入1,000行。然后删除了除一个以外的所有内容。高水位线仍然存在。所以全表扫描会把它们都读出来。

文档在 “逻辑存储结构” 部分中对此进行了更详细的解释:

https://docs.oracle.com/en/database/oracle/oracle-database/18/cncpt/logical-storage-structures.html#GUID-13CE5EDA-8C66-4CA0-87B5-4069215A368D

如果您真的很担心,可以缩小或移动表,以确保高水位线尽可能低。

但是!

如果您担心节省三个街区,那您就错了!

在其他地方几乎总是会有更大的收益。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论