2010-09-17 3 views
2

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

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

Спасибо,

ответ

4

Эта статья сообщает метод получения роста таблицы: 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'); 
2

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

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

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

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

+0

Используйте DBA_SEGMENTS вместо DBA_TABLES. Он точно скажет вам, сколько пространства использует объект на диске, и оно не зависит от оценок или статистики. –

+0

Помните, что таблица может состоять из разделов, которые DBA_TABLES не учитывают. Как показывает jonearles, DBA_SEGMENTS и учитывают разделы, также, если вы хотите включать двоичные столбцы объекта (BLOB, CLOB) DBA_LOBS также из-за того, что LOB, не сохраненные в строке, находятся в их собственном сегменте. – Stellios

+0

Насколько я знаю, AVG_ROW_LEN - статистика оптимизатора, а не реальная мера. Я имею в виду, что с соответствующими разрешениями вы можете перезаписать его значение. См. Http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i997763 – gpeche

Смежные вопросы