2016-04-13 9 views
0

Verwenden von Postgres .... erstens bin ich richtig in sagen "Toast Tischgröße" ist die Größe der Tabelle zugeordnet? und "Tabellengröße" ist die tatsächliche Größe der Daten in der Tabelle.bekommen tatsächliche Tischgröße nicht Toast

Ich habe eine neue Tabelle erstellt, die bis jetzt keine Daten enthält, ihre Tabellengröße ist 0 Bytes, aber ihre Toast-Tabellengröße ist 8192 Bytes.

Meine Frage Wesen:

SELECT pg_size_pretty(pg_table_size('zlimitreacjed_1')); 

gibt den Toast Größe der Tabelle ‚8192 Bytes‘ was ist die Abfrage, um die tatsächliche Größe der Daten in der Tabelle für die Rückkehr?

+0

'8K', die Standardeinstellung für die erste Seite. Schaut OK aus. – lad2025

+0

was? Ich frage, warum pg_table_size die Toast-Tabellengröße und nicht die tatsächliche Tabellengröße von 0 zurückgibt? – John

Antwort

1

TOAST-Daten in Postgres beziehen sich auf Werte, die außerhalb der Haupttabellendatei gespeichert wurden, in der Regel weil sie ziemlich groß sind. In Bezug auf "die tatsächliche Größe der Daten in der Tabelle" müssen die TOAST-Nummern enthalten sein, da sie Daten in der Tabelle sind.

pg_table_size meldet die Größe auf der Festplatte der Tabelle. Dies ist völlig anders als die Größe der Live-Daten in der Tabelle. Es gibt eine Reihe von Gründen dafür, einschließlich:

  • Raum von gelöschten Zeilen
  • Alte Versionen von Zeilen nach Updates links
  • Zeigern (dort eingesetzt, wo die tatsächlichen Daten stattdessen in einer Toast-Datei gespeichert worden die Hauptdatei)
  • Freiraum Karte
  • Seitenkopfinformation
  • Reihe Header-Informationen

Weitere Einzelheiten des Formats von Dateien überprüfen http://www.postgresql.org/docs/current/static/storage.html

Wenn Sie daran interessiert sind, wie groß die tatsächlichen Daten sind, würden Sie wirklich jeden Datensatz auswählen müssen und füge zusammen, um die Längen den alle nicht-null Felder in diesen Zeilen.

Sie können einen VACUUM FULL ausführen, der einen Teil des Nicht-Datenbereichs (bezogen auf gelöschte Zeilen usw.) löscht, aber der Speicher-Overhead bleibt weiterhin vorhanden.

+0

Wenn Sie nur die Größe für den Heap verwenden möchten, verwenden Sie pg_relation_size(). –

+0

@Jim Nasby Sie müssen immer noch mit den Daten umgehen, die in Toast und dem freien Speicherplatz im Heap gespeichert sind – Gary