我是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?
3条答案
按热度按时间58wvjzkj1#
Concepts guide概述了对象、段、范围和块之间的关系。
您的表有一个逻辑段,它有一个或多个扩展区,这些扩展区有一个或多个数据块(在数据文件中)。您的数据文件有8 K块大小,但您的数据文件有64 K的初始扩展区,即8个块。您可以在
dba_tablespaces
视图中看到初始/下一个扩展区的大小,例如:字符串
您可以通过指定“segment creation deferred”来创建一个不使用空间的表。第一个区段不会被分配,直到您实际插入一些数据。
立即创建:
型
对于延迟段创建:
型
如果你从一个表中删除数据,那么这些区段/块不会被释放,并且会被以后的插入重用(通常)。如果你
truncate
表,那么所有的数据都会被删除 * 并且 * 除了初始区段之外的所有数据都会被释放。(但是要小心truncate
,因为它不能回滚。)tkclm6bt2#
空间是以“扩展区”的形式分配的。扩展区是一系列连续的块,因此将是块大小的倍数。即使在最初创建表时,它也至少有一个扩展区分配给它。一个扩展区的64K似乎并不奇怪。
字符串
仔细阅读 * 数据库概念 * 指南的这一部分:https://docs.oracle.com/database/121/CNCPT/part_dbarch.htm#CNCPT88984
vqlkdk9b3#
dba_segments视图包含有关整个数据库中的段的信息。要执行此查询,您通常需要具有必要的权限,例如DBA或具有DBA角色的访问权限。
select bytes/1024/1024 MB from dba_segments where segment_name='TABLE_NAME' ;
以获取表大小所需的权限运行此查询