Frage zur TID

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Frage zur TID
Hallo, ich habe da eine Frage zu der TID und zwar wird ja jeder Satz identifizierbar über die TID (Blocknummer + Positionsindex)
Der Positionsindex ist der Index in der Hilfsstruktur (Feld) die in jedem Block liegt und auf die Anfangsadressen der Sätze innerhalb des Blocks zeigt.

Also die erste Frage ist, hat diese Hilfsstruktur eine feste größe oder wächst sie?

Da der Positionsindex fest ist, darf man bereits in das Feld eingetragene Anfangsadressen nicht löschen, sondern nur als ungültig markieren, z.B. mit -1
Wenn das Feld eine feste Länge hätte, wären somit nach einigen Einfüge- und Löschoperationen in dem Feld nur noch -1 -1 -1 … drin und man könnte diesen nicht mehr benutzen?
Außerdem wenn z.b das Feld nur die größe 4 hätte, könnte man nur maximal 4 Sätze im Block speichern, was auch nicht grade optimal wäre

Wenn das Feld aber variabel wäre, so würde dieses bei Einfüge und Löschoperationen immer weiter anwachsen, da zwar alte Einträge mit -1 markiert werden, aber nicht freigegeben werden dürfen zur Wiederverwendung, weil vielleicht ein externes Programm sich die TID gemerkt hat und mal darauf zugreifen will, aber dort inzwischen ganz andere Daten liegen würden, so würde der Platz in allen Blöcken bei jeder Einfüge und Löschoperation immer kleiner werden? Das kanns doch auch nicht sein?

Eventuell habe ich etwas ganz banales übersehen, vielleicht könnt ihr mir ja helfen?


Die Größe der Indexstruktur innerhalb der Seite ist variabel. Soll ein neuer Positionsindex angelegt werden, wird sie vergrößert. Wird ein Block Satz gelöscht, dann kommt es darauf an, welchen Positionsindex er hatte:

  • Steht er irgendwo in der Mitte der Indextabelle, wird er als gelöscht markiert und die Tabelle behält ihre Größe bei.
  • Steht er ganz am Ende, wird die Tabelle geschrumpft.
    Effektiv bedeutet das: Der letzte Eintrag der Indextabelle ist immer ein gültiger Eintrag.

Wenn ein Datensatz gelöscht wird, dann darf dessen TID für andere Daten wiederverwendet werden. Ein Aufrufer, der eine TID in der Hand hält und sagt „lösch das!“, kann danach keinerlei Annahmen mehr über die Daten treffen, die sich hinter dieser TID verbergen. Es ist also die Verantwortung des Aufrufers dafür zu sorgen, dass ein Datensatz nur dann gelöscht wird, wenn keine Verweise auf ihn mehr existieren!
Das ist so ähnlich, wie wenn jemand in C ein dynamisch alloziertes Stück Speicher wieder freigibt.


Danke, so ist alles klar und ergibt Sinn :slight_smile:

//PS: Du hast glaube ich paar mal Satz und Block verwechselt, aber das spielt für die Frage keine Rolle


Danke, ist korrigiert. :slight_smile: