Oracle表大小

vecaoik1  于 2023-11-17  发布在  Oracle
关注(0)|答案(3)|浏览(93)

我是SQL新手,目前正在使用Oracle SQL Developer。我如何在其中获得表的大小?我知道这个查询:

SELECT BYTES/1024
    FROM dba_segments
    WHERE segment_type='TABLE' and segment_name='T_LOG';

字符串
T_LOG是我的表)然而,这返回了64 KB的空表。我知道,空表仍然需要空间,但64 KB对我来说似乎太多了,特别是与其他数据库服务器相比,它们大约有8 KB。然后我发现了这个查询,它返回包含表的文件的块大小:

SELECT NAME "Filename",
    BLOCK_SIZE/1024 "Block size"
    FROM v$datafile;


我并不知道BLOCK_SIZE到底是什么,但它返回了8 KB,这对我来说更可信。现在,是否有其他查询可以获得不使用dba_segments的表的大小,或者在Oracle中创建的表实际上占用了64 KB?

58wvjzkj

58wvjzkj1#

Concepts guide概述了对象、段、范围和块之间的关系。
您的表有一个逻辑段,它有一个或多个扩展区,这些扩展区有一个或多个数据块(在数据文件中)。您的数据文件有8 K块大小,但您的数据文件有64 K的初始扩展区,即8个块。您可以在dba_tablespaces视图中看到初始/下一个扩展区的大小,例如:

select tablespace_name, initial_extent, next_extent
from dba_tablespaces;

字符串
您可以通过指定“segment creation deferred”来创建一个不使用空间的表。第一个区段不会被分配,直到您实际插入一些数据。
立即创建:

create table t_log (id number) segment creation immediate;

select bytes
from user_segments
where segment_type='TABLE' and segment_name='T_LOG';

     BYTES
----------
     65536

select extent_id, bytes, blocks
from user_extents
where segment_type='TABLE' and segment_name='T_LOG';

 EXTENT_ID      BYTES     BLOCKS
---------- ---------- ----------
         0      65536          8


对于延迟段创建:

create table t_log (id number) segment creation deferred;

select bytes
from user_segments
where segment_type='TABLE' and segment_name='T_LOG';

no rows selected

select extent_id, bytes, blocks
from user_extents
where segment_type='TABLE' and segment_name='T_LOG';

no rows selected

insert into t_log(id) values (42);

select bytes
from user_segments
where segment_type='TABLE' and segment_name='T_LOG';

     BYTES
----------
     65536

select extent_id, bytes, blocks
from user_extents
where segment_type='TABLE' and segment_name='T_LOG';

 EXTENT_ID      BYTES     BLOCKS
---------- ---------- ----------
         0      65536          8


如果你从一个表中删除数据,那么这些区段/块不会被释放,并且会被以后的插入重用(通常)。如果你truncate表,那么所有的数据都会被删除 * 并且 * 除了初始区段之外的所有数据都会被释放。(但是要小心truncate,因为它不能回滚。)

tkclm6bt

tkclm6bt2#

空间是以“扩展区”的形式分配的。扩展区是一系列连续的块,因此将是块大小的倍数。即使在最初创建表时,它也至少有一个扩展区分配给它。一个扩展区的64K似乎并不奇怪。

select bytes,
       blocks,
       extents,
       initial_extent
from dba_segments
where .....

字符串
仔细阅读 * 数据库概念 * 指南的这一部分:https://docs.oracle.com/database/121/CNCPT/part_dbarch.htm#CNCPT88984

vqlkdk9b

vqlkdk9b3#

dba_segments视图包含有关整个数据库中的段的信息。要执行此查询,您通常需要具有必要的权限,例如DBA或具有DBA角色的访问权限。

select bytes/1024/1024 MB from dba_segments where segment_name='TABLE_NAME' ;
以获取表大小所需的权限运行此查询

相关问题