Braucht NULL in Spalte Speicherplatz

Hallo zusammen,

ich arbeite mit einer Oracle 10 g Datenbank und müsste wissen ob ein Feld in einer Spalte Speicherplatz verbraucht, wenn kein Wert eingetragen ist. Es geht sich darum ob ein Datensatz in dem nicht alle Spalten gefüllt sind genau soviel Speicher braucht, wie ein Datensatz in dem alle Spalten gefüllt sind.

Besonders wichtig wäre es zu dieser Frage nicht nur eine Vermutung sondern eine fundierte Antwort, die sich auf eine sichere Quelle bezieht zu bekommen. Leider habe ich im Netz noch nichts gefunden und selbst die Oracle Support Hotline konnte mir bei meiner Frage nicht so einfach weiter helfen.

Vielen Dank für jede Hilfe, Schöne Grüße David

Besonders wichtig wäre es zu dieser Frage nicht nur eine
Vermutung sondern eine fundierte Antwort, die sich auf eine
sichere Quelle bezieht zu bekommen. Leider habe ich im Netz
noch nichts gefunden und selbst die Oracle Support Hotline
konnte mir bei meiner Frage nicht so einfach weiter helfen.

Dann hast aber weder du noch der Oracle Support in die Doku geschaut:
http://download-west.oracle.com/docs/cd/B14117_01/se…

Dort steht:
_Nulls are stored in the database if they fall between columns with data values. In these cases they require 1 byte to store the length of the column (zero).

Trailing nulls in a row require no storage because a new row header signals that the remaining columns in the previous row are null. For example, if the last three columns of a table are null, no information is stored for those columns. In tables with many columns, the columns more likely to contain nulls should be defined last to conserve disk space._

Also:
Ein NULL braucht 1 Byte Platz, ausser alle folgenden Spalten enthalten ebenfalls NULL-Values. In letzterem Fall braucht die Spalte keinen Platz, da das Ende des Datensatzes durch den Header des nächsten Datensatzes implizit erkannt wird.

Die komplette 10g Doku findest du hier:
http://download-west.oracle.com/docs/cd/B14117_01/in…

Hey super!!!
Vielen Dank, das ist genau das was ich gebraucht habe. Ist mir ja fast schon ein wenig unangenehm das ich es selbst nicht gefunden habe. Allerdings ist es auch recht schwach, dass der Mitarbeiter bei Oracle sagte, er könne mir da nicht weiterhelfen.

Die Info ist auf jden Fall Spitze! Danke!

Hi!

Es geht sich darum ob ein Datensatz
in dem nicht alle Spalten gefüllt sind genau soviel Speicher
braucht, wie ein Datensatz in dem alle Spalten gefüllt sind.

Wie schon gesagt: NULL braucht auch Platz, aber halt sehr wenig :wink: - eigentlich nur als eine Art „Delimiter“ („Nichts“ muß ja auch irgendwie dargestellt werden, um wieder darauf zugreifen zu können)

Ein Record braucht immer genausoviel Platz, wie er Daten enthält; der Platz wird _dynamisch_ ermittelt bzw. belegt (Stichwort: Buffer) bzw. wie er in PCTFREE bzw. PCTUSED in der Tabellendefinition angegeben wird.

Das Ganze wird schön visualisiert, wenn Du eine Tabelle analysierst und in DBA_TABLES/ALL_TABLES/USER_TABLES dort nach den Werten (NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, AVG_ROW_LEN - DAS dürfte für Dich der interessante Wert sein, etc.) suchst.

Eine Tabelle mit 2 Feldern (der Einfachheit halber):

ID TEXT

 1 a

23 defg

(ID number, text varchar2(10 Byte)
bedeutet, das die erste Zeile ca. 2 Byte braucht, die 2. ungefähr 6 Byte (kommt natürlich ganz auf den Zeichensatz und den Tabellendefinitionen an).

Bei _unglücklichen_ Tabellenparametern kann es natürlich passieren, das ein 2-Byte-Record wie auch ein 128KB-Record einen ganzen Buffer belegt … aber das ist eine andere Geschichte …

Grüße,
Tomh