Проблема:
- Как узнать сколько места занимает схема в Oracle.
- Как определить сколько места занимают таблицы в определенной схеме в Oracle.
- Как определить сколько места занимает таблица в Oracle.
- Как определить сколько места занимают индексы в Oracle.
- Как определить сколько места занимает индекс в определенной схеме в Oracle.
Инструментарий: Oracle 10, Oracle 11
Для определения сколько места занимает объект базы данных — можно воспользоваться представлением DBA_SEGMENTS или USER_SEGMENTS. Разница только в том что в USER_SEGMENTS возвращает описание лишь для текущего пользователя, а не для всей базы данных, и в нем отсутствует колонок: OWNER, HEADER_FILE, HEADER_BLOCK, or RELATIVE_FNO. В принципе можно воспользоваться и представлением DBA_SEGMENTS, только нужно указать OWNER’а, если конечно нужно узнать информацию о конкретной схеме.
Главный запрос от которого мы будим отталкиваться будет выглядеть следующим образом:
SELECT * FROM DBA_SEGMENTS
Code language: SQL (Structured Query Language) (sql)
- Определим сколько места занимают схемы, для этого выполним следующий запрос:
SELECT OWNER,
SUM(BYTES) SIZE_BYTES
FROM DBA_SEGMENTS
GROUP BY OWNER;
Code language: SQL (Structured Query Language) (sql)
В результате получим список схем и размер схем:
OWNER | SIZE_BYTES |
SYS | 2064187392 |
SCOTT | 327680 |
Результаты как Вы видите в байтах, перепишем запрос для отображения количества занимаемого пространства схемами удобной для просмотра единице измерения:
SELECT
OWNER,
CASE
WHEN (S.BYTES / 1024 / 1024 / 1024 / 1024) > 1 THEN TO_CHAR(S.BYTES / 1024 / 1024 / 1024 / 1024) || ' PB' --Petabytes
WHEN (S.BYTES / 1024 / 1024 / 1024 / 1024) > 1 THEN TO_CHAR(S.BYTES / 1024 / 1024 / 1024 / 1024) || ' TB' --Terabyte
WHEN (S.BYTES / 1024 / 1024 / 1024) > 1 THEN TO_CHAR(S.BYTES / 1024 / 1024 / 1024) || ' GB' --Gigabyte
WHEN (S.BYTES / 1024 / 1024) > 1 THEN TO_CHAR(S.BYTES / 1024 / 1024) || ' MB' --Megabyte
WHEN (S.BYTES / 1024) > 1 THEN TO_CHAR(S.BYTES / 1024) || ' KB' --Kilobyte
ELSE TO_CHAR(S.BYTES) || ' B' --Byte
END CASE
FROM (SELECT OWNER,
SUM(BYTES) AS BYTES
FROM DBA_SEGMENTS
GROUP BY OWNER) S
ORDER BY S.BYTES DESC
Code language: SQL (Structured Query Language) (sql)
OWNER | SIZE_BYTES |
SYS | 1.921875 GB |
SCOTT | 320 KB |
Запрос конечно не идеален, но все же позволяет узнать сколько занимает места схема в Oracle.
- Определим сколько места занимают таблицы в Oracle:
SELECT S.SEGMENT_NAME, S.BYTES
FROM DBA_SEGMENTS S
WHERE OWNER = '<название схемы>'
AND S.SEGMENT_TYPE = 'TABLE'
Code language: SQL (Structured Query Language) (sql)
- Определим сколько места занимает таблица в Oracle:
SELECT S.BYTES
FROM DBA_SEGMENTS S
WHERE OWNER = '<название схемы>'
AND S.SEGMENT_TYPE = 'TABLE'
AND S.SEGMENT_NAME = '<название таблицы>'
Code language: SQL (Structured Query Language) (sql)
- Определим сколько места занимает индекс в определенной схеме в Oracle:
SELECT S.BYTES
FROM DBA_SEGMENTS S
WHERE OWNER = '<название схемы>'
AND S.SEGMENT_TYPE = 'INDEX'
AND S.SEGMENT_NAME = '<название индекса>'
Code language: SQL (Structured Query Language) (sql)
- Определим сколько места занимают индекс в определенной схеме Oracle:
SELECT S.BYTES
FROM DBA_SEGMENTS S
WHERE OWNER = '<название схемы>'
AND S.SEGMENT_TYPE = 'INDEX'
Code language: SQL (Structured Query Language) (sql)