Oracle 10g Размер таблицы после удаления нескольких строк - PullRequest
4 голосов
/ 01 июля 2011

В рамках обслуживания мы удаляем значительное количество записей из одной таблицы и хотим избавиться от этого места для другой таблицы.Дело в том, что я проверяю размер таблицы, и она показывает тот же самый оригинальный размер перед удалением.Что мне здесь не хватает?

Чтобы проверить размер, я смотрю на dba_segments.

Ответы [ 4 ]

13 голосов
/ 01 июля 2011

Есть несколько концепций, которые вам необходимо знать о таблицах, прежде чем вы сможете по-настоящему понять использование пространства.Я попытаюсь дать вам 5-секундный тур ...

Таблица состоит из экстентов, они могут различаться по размеру, но давайте просто предположим, что они здесь составляют 1 МБ.

Когдавы создаете таблицу, обычно к ней добавляется 1 экстент, поэтому, хотя в таблице нет строк, она будет занимать 1 МБ.

Когда вы вставляете строки, в Oracle есть внутренний указатель для таблицы, известный как высокийводяной знак (HWM).Ниже HWM находятся отформатированные блоки данных, а над ними - неформатированные блоки.Он начинается с нуля.

Если вы возьмете новую таблицу в качестве примера и начнете вставлять строки, HWM будет двигаться вверх, давая все больше и больше этого первого экстента, который будет использоваться таблицей.Когда экстент полностью израсходован, будет выделен другой, и процесс повторяется.

Допустим, вы заполнили три экстента по 1 МБ, а затем удалили все строки - таблица пуста, но Oracle не перемещаетОтключите HWM или освободите использованные экстенты.Таким образом, таблица будет занимать 3 МБ на диске, даже если она пуста, но в ней есть 3 МБ свободного места, которое можно использовать повторно.Новые вставки будут помещаться в это пространство под HWM до тех пор, пока он снова не будет заполнен, прежде чем HWM будет снова перемещен.

Чтобы восстановить пространство, если ваша таблица использует ASSM, вы можете использовать команду:

alter table t1 shrink space;

Если вы не используете ASSM, вам нужно подумать о реорганизации таблицы, чтобы освободить место.

1 голос
/ 01 июля 2011

Если вы хотите «освободить» пространство, самый простой способ:

ALTER TABLE table MOVE TABLESPACE different_tablespace;

ALTER TABLE table MOVE TABLESPACE original_tablespace;

Если у вас есть:

  1. Некоторое время простоя, чтобы это сделать
  2. Второе табличное пространство с достаточным пространством для переноса таблицы.
1 голос
/ 01 июля 2011

Взгляните на этот сайт о размере таблицы после удаления строк.

Пространство эффективно повторно используется при удалении. Ваша база данных не будет отображать новые бесплатные пространство в dba_free_space - у него будет больше блоков в списках фрилансов и больше пустых мест индексные структуры.

0 голосов
/ 09 марта 2013
SELECT SUM(BYTES) 
FROM DBA_SEGMENTS 
WHERE SEGMENT_NAME LIKE 'YOUR TABLE NAME%';

Вы получите правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...