Ich bin an MSSQL gewöhnt (und möglicherweise von MSSQL verwöhnt) und frage mich, wie ich in Oracle 10g die Tabellengröße erreichen kann. Ich habe es gegoogelt, daher ist mir jetzt bewusst, dass ich möglicherweise keine so einfache Option wie sp_spaceused habe. Trotzdem sind die möglichen Antworten, die ich erhalten habe, meistens veraltet oder funktionieren nicht. Wahrscheinlich, weil ich kein DBA für das Schema bin, mit dem ich arbeite.
Hätte jemand Lösungen und / oder Empfehlungen?
Antworten:
Diese Abfrage könnte Sie interessieren. Hier erfahren Sie, wie viel Speicherplatz für jede Tabelle unter Berücksichtigung der Indizes und aller LOBs in der Tabelle zugewiesen ist. Oft sind Sie daran interessiert zu wissen, "wie viel Speicherplatz die Bestellungstabelle einschließlich etwaiger Indizes belegt" und nicht nur die Tabelle selbst. Sie können jederzeit in die Details eintauchen. Beachten Sie, dass hierfür Zugriff auf die DBA_ * -Ansichten erforderlich ist.
quelle
quelle
null
(num_rows
,avg_row_len
) sein, müssen Sie einige Analyse vor über die folgende Aussage machenANALYZE TABLE your_table COMPUTE STATISTICS
Zunächst einmal würde ich generell darauf hinweisen, dass das Sammeln von Tabellenstatistiken zur Durchführung von Raumanalysen eine potenziell gefährliche Sache ist. Das Sammeln von Statistiken kann Abfragepläne ändern, insbesondere wenn der DBA einen Job zum Sammeln von Statistiken konfiguriert hat, der nicht standardmäßige Parameter verwendet, die Ihr Aufruf nicht verwendet, und Oracle veranlasst, Abfragen, die die betreffende Tabelle verwenden, erneut zu analysieren, was eine Leistung sein kann schlagen. Wenn der DBA absichtlich einige Tabellen ohne Statistiken belassen hat (häufig, wenn Sie
OPTIMIZER_MODE
AUSGEWÄHLT haben), kann das Sammeln von Statistiken dazu führen, dass Oracle den regelbasierten Optimierer nicht mehr verwendet und den kostenbasierten Optimierer für eine Reihe von Abfragen verwendet, die eine erhebliche Leistung erbringen können Kopfschmerzen, wenn es unerwartet in der Produktion gemacht wird. Wenn Ihre Statistiken korrekt sind, können Sie direkt abfragen, ohne anzurufenUSER_TABLES
(oderALL_TABLES
oderDBA_TABLES
GATHER_TABLE_STATS
. Wenn Ihre Statistiken nicht korrekt sind, gibt es wahrscheinlich einen Grund dafür und Sie möchten den Status Quo nicht stören.Zweitens
sp_spaceused
ist dasDBMS_SPACE
Paket von Oracle wahrscheinlich das nächste Äquivalent zur SQL Server- Prozedur . Tom Kyte hat eine netteshow_space
Prozedur , die eine einfache Schnittstelle zu diesem Paket bietet und Informationen druckt, die denen ähneln, diesp_spaceused
ausgedruckt werden.quelle
Sammeln Sie zunächst die Optimierungsstatistiken auf dem Tisch (falls Sie dies noch nicht getan haben):
WARNUNG: Wie Justin in seiner Antwort sagt, wirkt sich das Sammeln von Optimierungsstatistiken auf die Abfrageoptimierung aus und sollte nicht ohne Sorgfalt und Rücksichtnahme erfolgen !
Ermitteln Sie dann aus den generierten Statistiken die Anzahl der von der Tabelle belegten Blöcke:
Die Gesamtzahl der der Tabelle zugewiesenen Blöcke beträgt Blöcke + leere Blöcke + num_freelist_blocks.
Blöcke ist die Anzahl der Blöcke, die tatsächlich Daten enthalten.
Multiplizieren Sie die Anzahl der Blöcke mit der verwendeten Blockgröße (normalerweise 8 KB), um den verbrauchten Speicherplatz zu erhalten - z. B. 17 Blöcke x 8 KB = 136 KB.
So tun Sie dies für alle Tabellen in einem Schema gleichzeitig:
Hinweis: Nach dem Lesen dieses AskTom-Threads wurden Änderungen an den oben genannten vorgenommen
quelle
Ich habe die WW-Abfrage geändert, um detailliertere Informationen bereitzustellen:
quelle
Für unterpartitionierte Tabellen und Indizes können wir die folgende Abfrage verwenden
quelle
IIRC Die Tabellen, die Sie benötigen, sind DBA_TABLES, DBA_EXTENTS oder DBA_SEGMENTS und DBA_DATA_FILES. Es gibt auch USER_- und ALL_-Versionen für Tabellen, die Sie sehen können, wenn Sie keine Administratorrechte auf dem Computer haben.
quelle
Hier ist eine Variante der WWs-Antwort, die Partitionen und Unterpartitionen enthält, wie andere oben vorgeschlagen haben, sowie eine Spalte, in der der TYP angezeigt wird: Tabelle / Index / LOB usw.
quelle
quelle
Ich habe die Abfrage geändert, um die Schemagröße pro Tabellenbereich zu erhalten.
quelle
Kommt darauf an, was du mit "Tabellengröße" meinst. Eine Tabelle bezieht sich nicht auf eine bestimmte Datei im Dateisystem. Eine Tabelle befindet sich in einem Tabellenbereich (möglicherweise mehrere Tabellenbereiche, wenn sie partitioniert ist, und möglicherweise mehrere Tabellenbereiche, wenn Sie auch Indizes für die Tabelle berücksichtigen möchten). Ein Tablespace enthält häufig mehrere Tabellen und kann auf mehrere Dateien verteilt sein.
Wenn Sie schätzen, wie viel Speicherplatz Sie für das zukünftige Wachstum der Tabelle benötigen, ist avg_row_len multipliziert mit der Anzahl der Zeilen in der Tabelle (oder der Anzahl der Zeilen, die Sie in der Tabelle erwarten) ein guter Leitfaden. Oracle lässt jedoch auf jedem Block etwas Speicherplatz frei, teilweise, damit Zeilen bei einer Aktualisierung "wachsen" können, teilweise, weil möglicherweise keine weitere ganze Zeile in diesen Block eingefügt werden kann (z. B. würde ein 8-KB-Block nur für 2 Zeilen passen von 3K, obwohl dies ein extremes Beispiel wäre, da 3K viel größer ist als die meisten Zeilengrößen). BLOCKS (in USER_TABLES) könnten daher eine bessere Anleitung sein.
Wenn Sie jedoch 200.000 Zeilen in einer Tabelle hätten und die Hälfte davon löschen würden, würde die Tabelle immer noch die gleiche Anzahl von Blöcken "besitzen". Sie werden nicht für andere Tabellen freigegeben. Außerdem werden Blöcke nicht einzeln zu einer Tabelle hinzugefügt, sondern in Gruppen, die als "Extent" bezeichnet werden. Daher wird es in der Regel EMPTY_BLOCKS (auch in USER_TABLES) in einer Tabelle geben.
quelle
Korrektur für partitionierte Tabellen:
quelle
Die einfache Auswahl, die die Rohgrößen der Tabellen basierend auf der Blockgröße zurückgibt, enthält auch die Größe mit Index
Wählen Sie Tabellenname, (nvl ((Summe (Blöcke) aus dba_indexes a, dba_segments b auswählen, wobei a.index_name = b.segment_name und a.table_name = dba_tables.table_name), 0) + Blöcke) * 8192/1024 TotalSize, Blöcke * 8 tableSize von dba_tables nach 3 sortieren
quelle
Ich fand das etwas genauer:
quelle
quelle
Es gibt noch eine Option, mit der Sie die Größe mit Joins auswählen und die Tabellengröße als Option auswählen können
quelle
Ich habe die gleiche Variante wie die letzten, die Segmente von Tabellendaten, Tabellenindizes und Blob-Feldern berechnet:
Quelle .
quelle