Oracle размер стола - PullRequest
0 голосов

Я новичок в SQL, в настоящее время использую Oracle SQL Developer. Как я могу получить размер моего стола в нем? Я знаю об этом запросе:

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

(T_LOG - это моя таблица). Однако это возвращает 64 КБ для пустой таблицы. Я понимаю, что пустая таблица все еще занимает место, но мне кажется, что 64 КБ это слишком много, особенно по сравнению с другими серверами баз данных, которые имеют около 8 КБ. Затем я нашел этот запрос, который возвращает размеры блоков файлов, содержащих таблицы:

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

На самом деле я не знаю, что такое BLOCK_SIZE, но это возвращает 8 КБ, что гораздо более вероятно меня. Теперь есть какой-либо другой запрос, чтобы получить размер таблицы, не использующей dba_segments, или таблицы, фактически созданные, занимают 64 КБ в Oracle?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Руководство Concepts содержит обзор взаимосвязи объектов, сегментов, экстентов и блоков.

В вашей таблице есть логический сегмент, который имеет один или несколько экстентов и эти экстенты иметь один или несколько блоков данных (в файлах данных). Ваш файл данных имеет размер блока 8 КБ, но начальная длина табличного пространства составляет 64 КБ, что составляет 8 блоков. Вы можете увидеть начальный / следующий экстент, размер которого указан в представлении dba_tablespaces, например:

select tablespace_name, initial_extent, next_extent
from dba_tablespaces;

Вы можете создать таблицу без пробелов, указав `` создание сегмента отложено '". Первый экстент затем не выделяется, пока вы фактически не вставите в него некоторые данные.

С немедленным созданием:

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, так как его нельзя откатить.)

1 голос
/ 23 марта 2020

Пространство выделено в «экстентах». Экстент - это серия смежных блоков, поэтому он будет кратен размеру вашего блока. Даже при первоначальном создании таблицы ей будет выделен хотя бы один экстент. 64K для одной степени не кажется странным вообще.

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

В этом разделе руководства по базам данных : https://docs.oracle.com/database/121/CNCPT/part_dbarch.htm#CNCPT88984

...