Connectez-vous à la base de données comme d'habitude
Cliquez sur l' Schemaonglet
Sur le Tableslien dans les objets de base de données
Entrez le nom du schéma et le nom de l'objet (facultatif) et cliquez sur Go
Utilisez le bouton radio pour sélectionner le tableau que vous souhaitez consulter et cliquez sur Edit(Ne cliquez pas sur le lien du nom du tableau)
Cliquez sur l' Segmentsonglet (et attendez ...)
Vous verrez la taille des données de la table et les index utilisés.
OK, cela répond techniquement à votre question. Mais une meilleure façon est:
Connexion à l'aide de SQLPLUS
Exécutez le script de Vincent.
J'aime enregistrer le script comme t.sqlréférence rapide
COLUMN size_mb FORMAT '999,999,990.0'
COLUMN num_rows FORMAT '999,999,990'
COLUMN fmt_short FORMAT A24
COLUMN owner FORMAT A16
COLUMN table_name LIKE fmt_short
COLUMN tablespace_name LIKE fmt_short
SET LINESIZE 200
SET AUTOTRACE OFF
COMPUTE SUM OF size_mb ON REPORT
BREAK ON REPORT
SELECT
lower( owner ) AS owner
,lower(table_name) AS table_name
,tablespace_name
,num_rows
,blocks*8/1024 AS size_mb
,pct_free
,compression
,logging
FROM all_tables
WHERE owner LIKE UPPER('&1')
OR owner = USER
ORDER BY 1,2;
CLEAR COMPUTES
CLEAR BREAKS
Vous n'êtes pas sûr que cela fonctionnera, car il ne prend pas en compte les index, n'est-ce pas?
Codek
1
@Codek: correct, ce n'est que l'espace utilisé par la table elle-même. Vous pouvez cependant calculer l'espace utilisé par les index par la même méthode (puisque les index sont des segments et ont des étendues).
Vincent
en effet - c'est juste plus délicat, car le "nom" d'un index peut être n'importe quoi!
Codek
1
Cela ne fonctionne que pour les tables qui n'ont pas de colonnes LOB.
Êtes-vous sûr que l'approche d'origine utilisant la vue all_tables inclut des extensions LOB? Je pense que non. En voici une que je trouve utile:
with da as (
SELECT owner, segment_name, SUM(bytes)/1024/1024 size_mb
FROM dba_extents
group by rollup(owner, segment_name)
) select owner, segment_name, size_mb, round(size_mb/total_mb*100)
from da
cross join (
select size_mb as total_mb
from da t where owner is null and segment_name is null
)
order by size_mb desc
Après quelques recherches et expériences sur Google, j'ai construit la requête suivante, qui fournit à mon avis le résultat le plus précis. Pour un utilisateur d'Oracle, il fournit l'espace libre / utilisé / total par type de table et de segment (TABLE *, INDEX *, LOB *). Vous pouvez facilement l'étendre afin de fournir des statistiques supplémentaires comme le nombre de blocs.
La sortie typique est:
table ; segment type ; used (mb) ; unused (mb) ; total (mb)
user ; INDEX ; 0,78; 0,00; 0,78
user ; LOBINDEX ; 0,15; 0,00; 0,15
user ; LOBSEGMENT ; 3,48; 1,19; 4,67
user ; TABLE ; 12,11; 2,74; 14,85
address ; INDEX ; 0,12; 0,00; 0,12
(...)
Scénario:
DECLARE
input_owner NVARCHAR2(128) := 'MY_ORACLE_OWNER';
segment_size_blocks NUMBER;
segment_size_bytes NUMBER;
used_blocks NUMBER;
used_bytes NUMBER;
expired_blocks NUMBER;
expired_bytes NUMBER;
unexpired_blocks NUMBER;
unexpired_bytes NUMBER;
total_blocks NUMBER;
total_bytes NUMBER;
unused_blocks NUMBER;
unused_bytes NUMBER;
last_ext_file_id NUMBER;
last_ext_blk_id NUMBER;
last_used_blk NUMBER;
result_table NVARCHAR2(128);
result_segment_type NVARCHAR2(128);
result_used_mb NUMBER;
result_unused_mb NUMBER;
result_total_mb NUMBER;
CURSOR cur
IS
SELECT
s.segment_name AS segment_name,
s.owner AS segment_owner,
s.partition_name AS partition_name,
s.segment_type AS segment_type,
CASE WHEN s.segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
THEN s.segment_name
WHEN s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
THEN (SELECT i.table_name
FROM dba_indexes i
WHERE s.segment_name = i.index_name AND s.owner = i.owner)
WHEN s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION')
THEN (SELECT l.table_name
FROM dba_lobs l
WHERE s.segment_name = l.segment_name AND s.owner = l.owner)
WHEN s.segment_type IN ('LOBINDEX')
THEN (SELECT l.table_name
FROM dba_lobs l
WHERE s.segment_name = l.index_name AND s.owner = l.owner)
ELSE 'Unknown'
END AS table_name,
s.bytes AS segment_bytes
FROM dba_segments s
WHERE owner = input_owner
ORDER BY table_name, segment_type;
BEGIN
dbms_output.put_line('table ; segment type ; used (mb) ; unused (mb) ; total (mb)');
FOR ro IN cur
LOOP
result_table := ro.table_name;
result_segment_type := ro.segment_type;
IF ro.segment_type IN ('TABLE', 'INDEX')
THEN
dbms_space.unused_space(
segment_owner => ro.segment_owner,
segment_name => ro.segment_name,
segment_type => ro.segment_type,
total_blocks => total_blocks,
total_bytes => total_bytes,
unused_blocks => unused_blocks,
unused_bytes => unused_bytes,
last_used_extent_file_id => last_ext_file_id,
last_used_extent_block_id => last_ext_blk_id,
last_used_block => last_used_blk);
result_used_mb := (total_bytes - unused_bytes) / 1024 / 1024;
result_unused_mb := unused_bytes / 1024 / 1024;
result_total_mb := total_bytes / 1024 / 1024;
ELSIF ro.segment_type IN ('LOBSEGMENT')
THEN
dbms_space.space_usage(
segment_owner => ro.segment_owner,
segment_name => ro.segment_name,
segment_type => 'LOB',
partition_name => ro.partition_name,
segment_size_blocks => segment_size_blocks,
segment_size_bytes => segment_size_bytes,
used_blocks => used_blocks,
used_bytes => used_bytes,
expired_blocks => expired_blocks,
expired_bytes => expired_bytes,
unexpired_blocks => unexpired_blocks,
unexpired_bytes => unexpired_bytes
);
result_used_mb := used_bytes / 1024 / 1024;
result_unused_mb := (segment_size_bytes - used_bytes) / 1024 / 1024;
result_total_mb := segment_size_bytes / 1024 / 1024;
ELSE
-- TODO ??
result_used_mb := ro.segment_bytes / 1024 / 1024;
result_unused_mb := 0;
result_total_mb := result_used_mb + result_unused_mb;
END IF;
dbms_output.put_line(
RPAD(result_table, 30) || '; ' ||
RPAD(result_segment_type, 20)|| '; ' ||
TO_CHAR(result_used_mb / 1024 / 1024, '999999999990D00')|| '; ' ||
TO_CHAR(result_unused_mb / 1024 / 1024, '999999999990D00')|| '; ' ||
TO_CHAR(result_total_mb / 1024 / 1024, '999999999990D00'));
END LOOP;
END;
Réponses:
Via OEM 10g,
Schema
ongletTables
lien dans les objets de base de donnéesGo
Edit
(Ne cliquez pas sur le lien du nom du tableau)Segments
onglet (et attendez ...)OK, cela répond techniquement à votre question. Mais une meilleure façon est:
J'aime enregistrer le script comme
t.sql
référence rapidela source
L'espace utilisé par une table est l'espace utilisé par toutes ses extensions:
la source
Êtes-vous sûr que l'approche d'origine utilisant la vue all_tables inclut des extensions LOB? Je pense que non. En voici une que je trouve utile:
Cela me montre ce qui utilise le plus d'espace.
la source
Après quelques recherches et expériences sur Google, j'ai construit la requête suivante, qui fournit à mon avis le résultat le plus précis. Pour un utilisateur d'Oracle, il fournit l'espace libre / utilisé / total par type de table et de segment (TABLE *, INDEX *, LOB *). Vous pouvez facilement l'étendre afin de fournir des statistiques supplémentaires comme le nombre de blocs.
La sortie typique est:
Scénario:
la source