10 июня 2011 г.

oracle: Слияние свободных экстентов в табличном пространстве

Это относится к табличным пространствам управляемых по словарю.

В процессе работы БД бывает такое, что несколько свободных экстентов идут друг за другом в таком случае их можно слить в один с помощью ALTER TABLESPACE tbs_name COALESCE

-- оценить фрагментацию

-- Если FSFI около 100 - фрагментации  нет
-- Если FSFI ближе к 0 - фрагментация есть
SELECT TABLESPACE_NAME,
     SQRT(MAX(BLOCKS)/SUM(BLOCKS))+
     (100/SQRT(SQRT(COUNT(BLOCKS)))) FSFI
    FROM DBA_FREE_SPACE
    GROUP BY TABLESPACE_NAME
    ORDER BY 1;

-- Посмотреть фрагментацию табличного пространства USERS (вариант 1)
SELECT   'free space' owner, '   ' OBJECT, file_id, block_id, blocks
    FROM dba_free_space
   WHERE tablespace_name = 'USERS'
UNION
SELECT   SUBSTR (owner, 1, 20), SUBSTR (segment_name, 1, 32), file_id,
         block_id, blocks
    FROM dba_extents
   WHERE tablespace_name = 'USERS'
ORDER BY 3, 4; 

-- Посмотреть фрагментацию табличного пространства USERS (вариант 2)
SELECT a.tablespace_name, a.file_id, a.block_id, a.blocks, b.block_id
  FROM dba_free_space a, dba_free_space b
 WHERE a.tablespace_name = 'USERS'
   AND b.tablespace_name = 'USERS'
   AND a.tablespace_name = b.tablespace_name
   AND a.file_id = b.file_id
   AND a.block_id + a.blocks = b.block_id;


-- выполнить слияние свободных экстентов
alter tablespace users coalesce;