Stellen Sie wie gewohnt eine Verbindung zur Datenbank her
Klicken Sie auf die SchemaRegisterkarte
Auf den TablesLink innerhalb von Datenbankobjekten
Geben Sie den Schemanamen und den Objektnamen ein (optional) und klicken Sie auf Go
Verwenden Sie das Optionsfeld, um die Tabelle auszuwählen, die Sie anzeigen möchten, und klicken Sie auf Edit(Klicken Sie nicht auf den Tabellennamen-Link).
Klicken Sie auf die SegmentsRegisterkarte (und warten Sie ...)
Sie sehen die Größe der Tabellendaten und die verwendeten Indizes.
OK, das hat deine Frage technisch beantwortet. Aber ein besserer Weg ist:
Melden Sie sich mit SQLPLUS an
Führen Sie das Skript von Vincent aus.
Ich möchte das Skript als t.sqlKurzreferenz speichern
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
Sie sind sich nicht sicher, ob dies funktioniert, da Indizes nicht berücksichtigt werden, oder?
Codek
1
@Codek: Richtig, dies ist nur der Platz, der von der Tabelle selbst verwendet wird. Sie können den von den Indizes verwendeten Speicherplatz jedoch auf dieselbe Weise berechnen (da Indizes Segmente sind und Ausmaße haben).
Vincent
in der Tat - es ist nur kniffliger, da der "Name" eines Indexes alles sein kann!
Codek
1
Dies funktioniert nur für Tabellen ohne LOB-Spalten.
Sind Sie sicher, dass der ursprüngliche Ansatz, der die Ansicht all_tables verwendet, LOB-Bereiche enthält? Ich würde nicht denken. Hier ist eine, die ich nützlich finde:
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
Nach einigen Google-Suchen und Experimenten habe ich die folgende Abfrage erstellt, die meines Erachtens das genaueste Ergebnis liefert. Für einen Oracle-Benutzer wird der freie / belegte / Gesamtspeicherplatz nach Tabellen- und Segmenttyp (TABLE *, INDEX *, LOB *) bereitgestellt. Sie können es einfach erweitern, um zusätzliche Statistiken wie Blockzählungen bereitzustellen.
Typische Ausgabe ist:
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
(...)
Skript:
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;
Antworten:
Über OEM 10g,
Schema
RegisterkarteTables
Link innerhalb von DatenbankobjektenGo
Edit
(Klicken Sie nicht auf den Tabellennamen-Link).Segments
Registerkarte (und warten Sie ...)OK, das hat deine Frage technisch beantwortet. Aber ein besserer Weg ist:
Ich möchte das Skript als
t.sql
Kurzreferenz speichernquelle
Der von einer Tabelle belegte Platz ist der von allen Ausmaßen belegte Platz:
quelle
Sind Sie sicher, dass der ursprüngliche Ansatz, der die Ansicht all_tables verwendet, LOB-Bereiche enthält? Ich würde nicht denken. Hier ist eine, die ich nützlich finde:
Es zeigt mir, was am meisten Platz beansprucht.
quelle
Nach einigen Google-Suchen und Experimenten habe ich die folgende Abfrage erstellt, die meines Erachtens das genaueste Ergebnis liefert. Für einen Oracle-Benutzer wird der freie / belegte / Gesamtspeicherplatz nach Tabellen- und Segmenttyp (TABLE *, INDEX *, LOB *) bereitgestellt. Sie können es einfach erweitern, um zusätzliche Statistiken wie Blockzählungen bereitzustellen.
Typische Ausgabe ist:
Skript:
quelle