Посмотреть размер таблицы в oracle

Обновлено: 02.07.2024

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

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

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

2 ответа

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

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

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

С созданием отложенного сегмента:

Если вы удаляете данные из таблицы, тогда экстенты / блоки не освобождаются и будут использоваться повторно при последующих вставках (обычно). Если вы truncate таблица, то все данные удаляются и все, кроме начального экстента, освобождаются. (Но будьте осторожны с truncate , поскольку его нельзя откатить.)

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

где
unformatted_blocks
Total number of blocks that are unformatted

unformatted bytes
Total number of bytes that are unformatted

fs1_blocks
Number of blocks that has at least 0 to 25% free space

fs1_bytes
Number of bytes that has at least 0 to 25% free space

fs2_blocks
Number of blocks that has at least 25 to 50% free space

fs2_bytes
Number of bytes that has at least 25 to 50% free space

fs3_blocks
Number of blocks that has at least 50 to 75% free space

fs3_bytes
Number of bytes that has at least 50 to 75% free space

fs4_blocks
Number of blocks that has at least 75 to 100% free space

fs4_bytes
Number of bytes that has at least 75 to 100% free space

ful1_blocks
Total number of blocks that are full in the segment

не очень очень удобная процедурка :)

не очень очень удобная процедурка :)

не очень очень удобная процедурка :)


документацию по пакету посмотри
там и по партиционированным обьектам вроде можно информацию получить
завтра точнее отпишу если надо
даже сегодня
точно, есть соответствующий параметр

автор
1. достаточно одного селекта

Сразу скажу, что код писался не для использования в промышленной системе, а для периодических разовых запусков, чтобы узнать размер таблицы, поэтому задачи обойтись одним селектом не стояла.
Вопрос был - как узнать размер таблицы, функция свою задачу выполняет.

автор
2. не стоит делать upper, лучше подавайте на вход сразу верное название
3. мешанина ALL_ c DBA_, да еще и их джойны без учета owner'a

ALL на DBA заменили.

А в join-ах было условие:
and
t.owner = upper(pOwner);

автор
4. не учитывает lob index'ы и вложенные таблицы

lob-сегменты и lob-индексы учитываются этим селектом:

select
sum(s.bytes) into val
from
dba_lobs t
inner join
dba_segments s on t.segment_name = s.segment_name
where
t.table_name = upper(pNazvanie)
and
t.owner = upper(pOwner);

автор
5. dba_segments достаточно "тяжелая" вьюха, если уж туда идти, то хотя бы один раз

Вот селект, который сам спросит OWNER-а, ну и после ввода выдаст список таблиц с размерами.

COLUMN TABLE_NAME FORMAT A32
COLUMN OBJECT_NAME FORMAT A32
COLUMN OWNER FORMAT A10

Привыкнув к MSSQL (и потенциально испорченный им), мне интересно, как я могу достичь размера таблиц в Oracle 10g. Я погуглил, поэтому теперь понимаю, что у меня может быть не такой простой вариант, как sp_spaceused. Тем не менее потенциальные ответы, которые я получил, в большинстве случаев устарели или не работают. Вероятно, потому что я не администратор баз данных по схеме, с которой работаю.

Есть ли у кого-нибудь решения или рекомендации?

если процедура выдачи ответа испорчена, тогда возьмите ответы, которые вы получили отсюда, и оберните их в процедуру и назовите ее . dun dun duh . sp_spaceused. В этом действительно мало волшебства. @MarkBrady Может быть, и не магия, но требуется тонна тайных знаний.

Возможно, вам будет интересен этот запрос. Он сообщает вам, сколько места выделено для каждой таблицы, с учетом индексов и любых больших объектов в таблице. Часто вас интересует, «Сколько места занимает таблица заказа на закупку, включая любые индексы», а не только сама таблица. Вы всегда можете вникнуть в детали. Обратите внимание, что для этого требуется доступ к представлениям DBA_ *.

Обратите внимание, что в этом ответе учитываются сегменты, при этом не проводится различие между пространством, которое используется в настоящее время, и пространством, которое использовалось ранее. Очевидно, что как только сегмент назначается таблице, он всегда назначается таблице, даже если пространство освобождено. Смотрите здесь . Я полагаю, вам нужно спуститься до уровня экстента, чтобы увидеть, сколько места фактически используется ?

Примечание. Это оценки, которые стали более точными с помощью сбора статистики:

Эти статистические данные могут быть null ( num_rows , avg_row_len ), вам необходимо провести некоторый анализ перед этим с помощью следующего утверждения ANALYZE TABLE your_table COMPUTE STATISTICS хорошая работа, когда я не могу проверить таблицу без табличного пространства

Во-первых, я бы хотел предупредить, что сбор статистики таблиц для анализа пространства - это потенциально опасное занятие. Сбор статистики может изменить планы запросов, особенно если администратор баз данных настроил задание по сбору статистики, которое использует параметры, отличные от параметров по умолчанию, которые не используются вашим вызовом, и заставит Oracle повторно анализировать запросы, использующие рассматриваемую таблицу, что может быть производительностью ударить. Если администратор базы данных намеренно оставил некоторые таблицы без статистики (обычно, если вы OPTIMIZER_MODE выбрали CHOOSE), сбор статистики может привести к тому, что Oracle прекратит использование оптимизатора на основе правил и начнет использовать оптимизатор на основе затрат для набора запросов, что может быть основной производительностью. головная боль, если это происходит неожиданно на производстве. Если ваша статистика точна, вы можете запросить USER_TABLES (или ALL_TABLES или DBA_TABLES ) напрямую без звонка GATHER_TABLE_STATS . Если ваша статистика неточна, вероятно, для этого есть причина, и вы не хотите нарушать статус-кво.

Во-вторых, наиболее близким эквивалентом sp_spaceused процедуры SQL Server, вероятно, является DBMS_SPACE пакет Oracle . У Тома Кайта есть хорошая show_space процедура, которая обеспечивает простой интерфейс для этого пакета и выводит на печать информацию, аналогичную той, что sp_spaceused выводится.

Сначала соберите статистику оптимизатора в таблице (если вы еще этого не сделали):

ВНИМАНИЕ: как сказал Джастин в своем ответе, сбор статистики оптимизатора влияет на оптимизацию запросов и не должен выполняться без должной осторожности и внимания !

Затем найдите количество блоков, занятых таблицей, из сгенерированной статистики:

Общее количество блоков, выделенных для таблицы, составляет блоки + empty_blocks + num_freelist_blocks.

блоки - это количество блоков, которые фактически содержат данные.

Умножьте количество блоков на размер используемого блока (обычно 8 КБ), чтобы получить занимаемое пространство - например, 17 блоков x 8 КБ = 136 КБ.

Чтобы сделать это сразу для всех таблиц в схеме:

Примечание: изменения, внесенные в приведенное выше после прочтения этой ветки AskTom

Я изменил запрос WW, чтобы предоставить более подробную информацию:

Для суб-секционированных таблиц и индексов мы можем использовать следующий запрос

IIRC, вам нужны таблицы DBA_TABLES, DBA_EXTENTS или DBA_SEGMENTS и DBA_DATA_FILES. Существуют также версии USER_ и ALL_ для таблиц, которые вы можете увидеть, если у вас нет прав администратора на машине.

Вот вариант ответа WW, он включает в себя разделы и подразделы, как предлагали другие выше, плюс столбец для отображения ТИПА: Таблица / Индекс / LOB и т. Д.

Я изменил запрос, чтобы получить размер схемы для каждого табличного пространства.

Зависит от того, что вы подразумеваете под «размером стола». Таблица не относится к конкретному файлу в файловой системе. Таблица будет находиться в табличном пространстве (возможно, в нескольких табличных пространствах, если она разбита на разделы, и, возможно, в нескольких табличных пространствах, если вы также хотите учитывать индексы в таблице). Табличное пространство часто будет содержать несколько таблиц и может быть распределено по нескольким файлам.

Если вы оцениваете, сколько места вам понадобится для будущего роста таблицы, тогда avg_row_len, умноженный на количество строк в таблице (или количество строк, которые вы ожидаете в таблице), будет хорошим ориентиром. Но Oracle оставит некоторое пространство свободным в каждом блоке, отчасти для того, чтобы строки могли `` расти '' при их обновлении, отчасти потому, что может оказаться невозможным уместить еще одну целую строку в этом блоке (например, блок 8K поместится только в 2 строки 3 КБ, хотя это был бы крайний пример, поскольку 3 КБ намного больше, чем большинство размеров строк). Так что BLOCKS (в USER_TABLES) может быть лучшим руководством.

Но если бы у вас было 200000 строк в таблице, вы удалили половину из них, тогда таблица все равно «владеет» тем же количеством блоков. Это не освобождает их для использования другими таблицами. Кроме того, блоки добавляются в таблицу не по отдельности, а в группах, называемых «экстентом». Таким образом, в таблице обычно будет EMPTY_BLOCKS (также в USER_TABLES).

Способ просмотра размера табличного пространства Oracle

Метод просмотра размера табличного пространства Oracle должен быть тем знанием, которое нам всем необходимо освоить. Ниже приводится подробное введение в метод просмотра размера табличного пространства Oracle для вашей справки.

В управлении базой данных проблема с диском является проблемой, с которой сталкивается администратор баз данных, и эта проблема является относительно распространенной.

--1 Просмотреть размер табличного пространства Oracle - процент использования.

«Сумма МБ» обозначает общее дисковое пространство, занимаемое всеми файлами данных в табличном пространстве в операционной системе.
Например: тестовое табличное пространство содержит 2 файла данных, datafile1 - 300 МБ, datafile2 - 400 МБ, тогда «Сумма МБ» тестового табличного пространства составляет 700 МБ.
«Userd MB» указывает, сколько табличного пространства было использовано
«Свободный МБ» указывает, сколько табличного пространства осталось
«Percent_user» указывает используемый процент

--2 Например, из 1, чтобы увидеть, что процент использования табличного пространства MLOG_NORM_SPACE достиг более 90%, вы можете проверить, сколько файлов данных содержится в табличном пространстве, автоматически ли каждый файл данных расширяется, а также максимальное значение, которое может быть автоматически расширено.

--3 Например, текущий размер табличного пространства MLOG_NORM_SPACE составляет 19 ГБ, но максимальный размер каждого файла данных составляет всего 20 ГБ. Файл данных собирается заполниться, и файл данных табличного пространства может быть увеличен.
Используйте команду df -g в операционной системе UNIX и Linux (проверьте доступное дисковое пространство)
Получите инструкцию для создания табличного пространства:

--4 Убедитесь, что на диске достаточно места, добавьте файл данных

--5 Убедитесь, что файл данных был добавлен

--6 Если вы удалите файл данных табличного пространства, выполните следующие действия:

Похоже, вы пытаетесь ответить на коллекцию. Для этого вам нужно настроить сериализатор (или получить данные в виде массива).

Зависит, что Вы подразумеваете "под размером таблицы". Таблица не касается определенного файла в файловой системе. Таблица будет находиться на табличной области (возможно несколько табличных областей, если она будет разделена, и возможно несколько табличных областей, если Вы также хотите принять во внимание индексы на таблице). Табличная область будет часто иметь несколько таблиц в ней и может быть распространена через несколько файлов.

, Если Вы оцениваете, в каком количестве пространства Вы будете нуждаться для будущего роста таблицы, затем avg_row_len умноженный на количество строк в таблице (или количество строк Вы ожидаете в таблице) будет хорошее руководство. Но Oracle оставит некоторое пространство свободным на каждом блоке, частично чтобы позволить, чтобы строки 'выросли', если они будут обновлены, частично потому что не может быть возможно соответствовать другой всей строке на том блоке (например, 8K блок только соответствовал бы 2 строкам 3K, хотя это будет экстремальным примером, поскольку 3K намного больше, чем большинство размеров строки). Таким образом, БЛОКИ (в USER_TABLES) могли бы быть лучшим руководством.

, Но если бы у Вас было 200 000 строк в таблице, удалил половину из них, затем таблица все еще 'владела' бы тем же количеством блоков. Это не выпускает их для других таблиц для использования. Кроме того, блоки не добавляются к таблице индивидуально, но в группах, названных 'степенью'. Таким образом, там обычно будут EMPTY_BLOCKS (также в USER_TABLES) в таблице.

Вы могли бы интересоваться этим запросом. Это говорит Вам, сколько места выделено для каждой таблицы, принимающей во внимание индексы и любые СВЕЧИ на таблице. Часто Вам интересно знать, "Сколько пробелов таблица Purchase Order берет, включая любые индексы", а не просто саму таблицу. Можно всегда копаться в деталях. Обратите внимание, что это требует доступа к представлениям DBA_*.

Во-первых, соберите статистику оптимизатора на таблице (если Вы уже не имеете):

ПРЕДУПРЕЖДЕНИЕ: Поскольку Justin говорит в своем ответе, заключая, что статистика оптимизатора влияет на оптимизацию запросов и не должна быть сделана без должного ухода и соображения !

Затем находят количество блоков занятым таблицей из сгенерированной статистики:

общее количество блоков, выделенных таблице, является блоками + empty_blocks + num_freelist_blocks.

блоки являются количеством блоков, которые на самом деле содержат данные.

Умножают количество блоков используемым размером блока (обычно 8 КБ) для использования пространства - например, 17 блоков x 8 КБ = 136 КБ.

, Чтобы сделать это для всех таблиц в схеме сразу:

Примечание: Изменения, внесенные в вышеупомянутое после чтения этот поток AskTom

Прежде всего я обычно предостерегал бы, что, собирая статистику таблицы, чтобы сделать, анализ пространства является потенциально опасной вещью сделать. Сбор статистики может изменить планы запросов, особенно если DBA настроил сборочное задание статистики, которое использует параметры не по умолчанию, которые Ваш вызов не использует и заставит Oracle повторно анализировать запросы, которые используют рассматриваемую таблицу, которая может быть хитом производительности. Если DBA намеренно встал из-за некоторых столов без статистики (распространенный, если Ваш OPTIMIZER_MODE , ВЫБИРАЮТ), заключая, что статистика может заставить Oracle прекращать использовать основанный на правилах оптимизатор и начинать использовать оптимизатор на основе издержек для ряда запросов, которые могут быть сильной головной болью производительности, если это неожиданно сделано в производстве. Если Ваши статистические данные точны, можно запросить USER_TABLES (или ALL_TABLES или DBA_TABLES ) непосредственно, не звоня GATHER_TABLE_STATS . Если Ваши статистические данные не точны, существует, вероятно, причина этого, и Вы не хотите нарушать статус-кво.

1111-секундный, самым близким эквивалентом процедуре SQL Server sp_spaceused является вероятная Oracle DBMS_SPACE пакет. У Tom Kyte есть хорошее show_space процедура , которая предоставляет простой интерфейс этому пакету и распечатывает информацию, подобную тому, что sp_spaceused распечатывает.

IIRC таблицы, в которых Вы нуждаетесь, являются DBA_TABLES, DBA_EXTENTS или DBA_SEGMENTS и DBA_DATA_FILES. Существует также USER_ и версии ALL_ их для таблиц, которые Вы видите, нет ли у Вас полномочий администрирования на машине.

ответ дан ConcernedOfTunbridgeWells 2 December 2013 в 12:35 Шанс, что до н.э. это - просто ГЛАВНЫЙ запрос, можно пойти междоменный? – 13 June 2013 в 09:23

Простой выбор, который возвращает исходные размеры таблиц на основе размера блока, также включает размер с индексом

Читайте также: