Frage zu FAQs

Hallo,

im Frequently Asked Questions (FAQ) for PostgreSQL

http://www.postgresql.org/docs/faqs.FAQ.html#item4.5

habe ich folgende gelesen:

4.5) How much database disk space is required to store data from a typical text file?

A PostgreSQL database may require up to five times the disk space to store data from a text file.

As an example, consider a file of 100,000 lines with an integer and text description on each line. Suppose the text string avergages twenty bytes in length. The flat file would be 2.8 MB. The size of the PostgreSQL database file containing this data can be estimated as 5.6 MB:

28 bytes: each row header (approximate)
+24 bytes: one int field and one text field

  • 4 bytes: pointer on page to tuple

56 bytes per row

The data page size in PostgreSQL is 8192 bytes (8 KB), so:

8192 bytes per page
----------------------------- = 146 rows per database page (rounded down)
56 bytes per row

100000 data rows
--------------------------- = 685 database pages (rounded up)
146 rows per page

685 database pages * 8192 bytes per page = 5,611,520 bytes (5.6 MB)

Indexes do not require as much overhead, but do contain the data that is being indexed, so they can be large also.

NULLs are stored as bitmaps, so they use very little space.

Ich hätte gerne wissen, woher die 28 bytes in der Rechnung herkommen. Kann jemand mir vielleicht erklären?

vielen Dank!

gang

Suppose the text string avergages twenty bytes in length.

Wirf doch mal einen Blick in den Anfang des Textes: es wird angenommen, das der Text im Durchschnitt 20 Zeichen lang ist. Dann kommen noch 4 Bytes für einen Integer und 4 Bytes für den Header hinzu. Bist du bei den kalkulierten 28 Bytes.

Ich glaube nicht, die 28 Bytes sind doch zusätzlich, sonst kommt man auch nicht auf “56 bytes per row”, oder :roll:

28 bytes: each row header (approximate)
24 bytes: one int field and one text field

  • 4 bytes: pointer on page to tuple

56 bytes per row

Ich interessiere mich deswegen dafür, weil ich genauer auf meine DB Größe kalkulieren muss.

Ok, wenn ich das jetzt richtig lese (in #postgresql antwortet gerade niemand von den Entwicklern) dann sind die ersten 28 Bytes der Overhead für eine Zeile. Danach kommen deine Daten und ein Zeiger, wo die Daten liegen.