Дисковое пространство Oracle, используемое таблицей

У меня есть таблица в базе данных Oracle, которая каждый месяц получает пару миллионов новых строк. Каждая строка имеет столбец, в котором указана дата создания.

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

Спасибо,


person wsb3383    schedule 17.09.2010    source источник


Ответы (2)


В этой статье описывается метод получения роста таблицы: http://www.dba-oracle.com/t_table_growth_reports.htm

column "Percent of Total Disk Usage" justify right format 999.99
column "Space Used (MB)" justify right format 9,999,999.99
column "Total Object Size (MB)" justify right format 9,999,999.99
set linesize 150
set pages 80
set feedback off

select * from (select to_char(end_interval_time, 'MM/DD/YY') mydate, sum(space_used_delta) / 1024 / 1024 "Space used (MB)", avg(c.bytes) / 1024 / 1024 "Total Object Size (MB)", 
round(sum(space_used_delta) / sum(c.bytes) * 100, 2) "Percent of Total Disk Usage"
from 
   dba_hist_snapshot sn, 
   dba_hist_seg_stat a, 
   dba_objects b, 
   dba_segments c
where begin_interval_time > trunc(sysdate) - &days_back
and sn.snap_id = a.snap_id
and b.object_id = a.obj#
and b.owner = c.owner
and b.object_name = c.segment_name
and c.segment_name = '&segment_name'
group by to_char(end_interval_time, 'MM/YY'))
order by to_date(mydate, 'MM/YY');
person Wolph    schedule 17.09.2010

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

Предостережения по этому поводу: предполагается, что длина новых строк аналогична длине существующих строк. Если у вас есть куча исторических данных, которые были «маленькими» (например, 50 байт), но новые строки больше (150 байт), то оценки будут слишком низкими.

Кроме того, как обновления фигурируют в вещах? Если строка начинается с 50 байт и через два месяца увеличивается до 150, как вы учитываете эти 100 байт?

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

person Gary Myers    schedule 17.09.2010
comment
Используйте DBA_SEGMENTS вместо DBA_TABLES. Он точно скажет вам, сколько места объект использует на диске, и это не зависит от оценок или статистики. - person Jon Heller; 17.09.2010
comment
Помните, что таблица может состоять из разделов, которые DBA_TABLES не будет учитывать. Как предлагает jonearles, DBA_SEGMENTS и учет для разделов также, если вы хотите включить столбцы двоичных объектов (BLOB, CLOB), DBA_LOBS также потому, что большие объекты, не хранящиеся в строке, находятся в своем собственном сегменте. - person Stellios; 17.09.2010
comment
Насколько я знаю, AVG_ROW_LEN — это статистика оптимизатора, а не реальная мера. Я имею в виду, что с соответствующими разрешениями вы можете перезаписать его значение. См. download.oracle.com/docs/cd /B19306_01/appdev.102/b14258/ - person gpeche; 17.09.2010