Определение размера индекса и таблицы, BLOB поля в ORACLE

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

Узнаем размер индекса в ORACLE.

select segment_name                   index_name,
       ceil(sum(bytes) / 1024)        index_size_kb,
       ceil(sum(bytes) / 1024 / 1024) index_size_mb
  from dba_segments 
 where owner = 'ИМЯ_СХЕМЫ'
   and segment_type = 'INDEX'
   and segment_name = 'ИМЯ_ИНДЕКСА'
 group by segment_name
 ORDER BY index_size_mb desc;

Узнаем размер таблицы в ORACLE.

select segment_name table_name, 
       ceil(sum(bytes) / 1024) table_size
  from dba_segments
 where owner = 'ИМЯ_СХЕМЫ'
       and segment_type = 'TABLE'
       and segment_name = 'ИМЯ_ТАБЛИЦЫ'
 group by segment_name

Определяем размер таблицы и всех ее индексов Oracle

select t.table_name table_name,
       t.table_size table_size_KB,
       i.index_name index_name,
       i.index_size index_size_KB
  from (select segment_name table_name, 
               ceil(sum(bytes) / 1024) table_size
          from dba_segments
         where owner = 'ИМЯ_СХЕМЫ'
           and segment_type = 'TABLE'
           and segment_name = 'ИМЯ_ТАБЛИЦЫ'
         group by segment_name) t
  left join dba_indexes ti
    on ti.table_name = t.table_name
  left join (select segment_name index_name,
                    ceil(sum(bytes) / 1024) index_size
               from dba_segments
              where owner = 'ИМЯ_СХЕМЫ'
                and segment_type = 'INDEX'
              group by segment_name) i
    on i.index_name = ti.index_name
 order by i.index_size desc;

Определение размера BLOD поля

select sum(dbms_lob.getlength('BLOB поле') / 1024/ 1024) size_mb
from 'ИМЯ_ТАБЛИЦЫ'

Как узнать размер секционированной таблицы с lob-полями

Если таблица секционирована, то её размер равен суммарному размеру всех сегментов её секций. Если при этом она содержит lob — поля, то к сумме размеров секций надо прибавить сумму размеров всех lob-сегментов, ассоциированных с этой таблицей.Этот запрос сводит всё воедино:

SELECT 
ROUND(
	(
		(
		 SELECT SUM(s.bytes)
		 FROM dba_lobs d, dba_segments s
		 WHERE d.segment_name = s.segment_name
		 AND d.owner = 'CUBE'
		 AND d.table_name = 'PART_LOB_TABLE'
		)
		+
		(
		 SELECT SUM(d.bytes) 
		 FROM dba_segments d
		 WHERE d.owner = 'CUBE'
		 AND d.segment_name = 'PART_LOB_TABLE'
		)
	)/1024/1024/1024, 2) gb
FROM dual;

Размер таблиц в указанной схеме с учет LOB полей

SELECT tab.owner
     , tab.table_name
     , sum(round((nvl(seg.bytes,0) + nvl(seg_lobs.bytes,0)) /1024/1024,      2)) mb
     , sum(round((nvl(seg.bytes,0) + nvl(seg_lobs.bytes,0)) /1024/1024/1024, 2)) gb
  FROM dba_segments seg
  JOIN dba_tables   tab 
    ON seg.segment_name = tab.table_name 
   AND seg.owner        = tab.owner 
  LEFT
  JOIN dba_lobs lobs
    ON lobs.table_name = tab.table_name
   AND lobs.owner      = tab.owner     
  LEFT
  JOIN dba_segments seg_lobs 
    ON  seg_lobs.segment_name = lobs.segment_name 
 WHERE 1=1
   AND tab.owner in ('наименование_схемы')
   --AND tab.table_name = upper('наименование_таблицы') -- ограничение на таблицу
 GROUP
    BY tab.owner, tab.table_name
 ORDER 
    BY mb desc;   

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

Выводит таблицы размер, которых больше одного 1 Гб. Это условие в запросе можно заменить на свое.

SELECT owner
     , segment_name
     , segment_type
     , tablespace_name
     , ROUND(SUM(bytes) / 1024 / 1024 / 1024) gb
     , COUNT('x') cnt
  FROM dba_segments
 WHERE owner IN (SELECT username 
                   FROM dba_users 
                  WHERE oracle_maintained = 'N'
                )
 GROUP 
    BY owner
     , segment_name
     , segment_type
     , tablespace_name
HAVING 
       SUM(bytes) / 1024 / 1024 / 1024 >= 1
 ORDER 
    BY owner, 5 DESC
07:29
3601
Гость
15:29
Спасибо, Алексей.
Загрузка...