Мне нужно добавить несколько индексов в умеренно большую таблицу, и я хотел бы заранее знать, есть ли в табличном пространстве место для хранения индекса. (Предполагается, что экстенты автоматически увеличиваются в размере, но администраторы баз данных не всегда настраивают это правильно, и я не хочу быть тем, кто выдает сбой в системе.) Какой SQL мне нужно запустить, чтобы увидеть, как много места доступно?
select tablespace_name, round(sum(bytes)/(1024*1024)) free_mb
from dba_free_space group by tablespace_name;
Но не всегда все так просто. Хотя может быть, например, доступно 100M и вы можете захотеть создать индекс, который, по вашим оценкам, будет 80M, он может попытаться получить новый экстент 120M и потерпеть неудачу.
Кроме того, если у вас был стол размером 50 МБ и вы его уронили, ваши 100 МБ могут быть двумя кусками по 50 МБ. Опять же, если база данных пытается получить 100-мегабайтный экстент, это может потерпеть неудачу.
И если в табличном пространстве нет свободного места, но он настроен на автоматическое расширение (segment_space_management в dba_tablespaces), тогда оно может отображаться как имеющее недостаточно места, но будет работать. Или нет, в зависимости от того, достаточно ли места в базовой файловой системе.