问题描述
嗨,
我在我的数据库上执行下面的查询,并找到给定的输出:
输出:
考虑到每个块大小为8k字节,当我们在表中有非常少量的数据时,可能是多块分配的可能原因 (除了碎片)。另外,我如何将此块分配减少到最小。
提前谢谢。
我在我的数据库上执行下面的查询,并找到给定的输出:
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数据库不会一次执行一个块。相反,它分配了一个范围。这是一组连续的数据块。
第一个范围的大小由表空间的初始大小决定:
现在,是否使用这些块是另一回事。这取决于您过去在其上运行的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
如果您真的很担心,可以缩小或移动表,以确保高水位线尽可能低。
但是!
如果您担心节省三个街区,那您就错了!
在其他地方几乎总是会有更大的收益。
第一个范围的大小由表空间的初始大小决定:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。