Узнайте размер каждой таблицы в табличном пространстве? - PullRequest
2 голосов
/ 07 февраля 2011

Я хочу узнать размер всех таблиц в определенном табличном пространстве, в оракуле 10g

O / P должен указывать размер, занимаемый в настоящее время каждым Таблица. Он должен включать размер поля большого двоичного объекта, если оно есть в таблице, также он должен включать размер любого индекса, если он находится в этой таблице.

В настоящее время я использую этот запрос, но он не включает размер индекса, а также не уверен, включает ли он размер BLOB-объекта.

select TABLE_NAME, ROUND((AVG_ROW_LEN * NUM_ROWS / 1024), 2) ROW_SIZE_KB, (BLOCKS * 8)  BLOCK_SIZE_KB  
from USER_TABLES  
order by TABLE_NAME

Предложения ..

Было бы здорово, если бы кто-то мог написать какой-нибудь запрос, который дает размер каждого поля в таблице, а также общий размер таблицы и размер каждого индекса, если он есть в таблице.

РЕДАКТИРОВАТЬ: Что я на самом деле хочу: я хочу знать фактическое пространство, занимаемое таблицей, пространство, фактически потребляемое моими данными. не пустое место. и если есть какие-либо индексы, то размер индекса, а не дополнительные байты, которые oracle хранит для будущего использования.

мотив: Я переместил несколько баз данных из Oracle в SqlServer 2008, используя SSMA. Проблема, с которой я сталкиваюсь, заключается в том, что размер баз данных уменьшился с 80 ГБ (в Oracle) до 20 ГБ (в SqlServer). Я использовал этот запрос:

SELECT
  /* + RULE */
  df.tablespace_name "Tablespace",
  df.bytes / (1024*1024*1024) "Size(GB)",
  SUM(fs.bytes) / (1024*1024*1024) "Free(GB)",
  NVL(ROUND(SUM(fs.bytes) * 100 / df.bytes),1) "%Free",
  ROUND((df.bytes         - SUM(fs.bytes)) * 100 / df.bytes) "%Used"
FROM dba_free_space fs,
  (SELECT tablespace_name,
    SUM(bytes) bytes
  FROM dba_data_files
  WHERE tablespace_name not like 'SCN%'
  GROUP BY tablespace_name
  ) df
WHERE fs.tablespace_name (+) = df.tablespace_name 
GROUP BY df.tablespace_name, df.bytes
order by 3 desc

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

Ответы [ 3 ]

3 голосов
/ 07 февраля 2011

Чтобы получить общее выделенное пространство.

select bytes from user_segments where segment_name = 'TABLE_NAME';

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

0 голосов
/ 24 марта 2013

Проверить размер индексов и таблиц

выберите подстроку (имя_сегмента, 1,30) имя_сегмента, байт / 1024/1024 "Размер в МБ" из пользовательских_сегментов где имя_сегмента в ('TABLE_NAME');

Арвинд Кумар

0 голосов
/ 07 февраля 2011

Функция vsize возвращает количество байтов во внутреннем представлении большинства столбцов. DBMS_LOB.GETLENGTH возвращает количество байтов или символов в группе.

select vsize(not_a_lob_col), DBMS_LOB.GETLENGTH(a_lob_col) from a_table;

Руководство "Руководство разработчика приложений для баз данных Oracle - крупные объекты" содержит дополнительную информацию о пакете DBMS_LOB.

Ни одна из функций не включает в себя байты (3 для больших varchars) служебных данных для каждого столбца.

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