Einführung in PostgreSQL-Tupel

Artikelverzeichnis

  • Vorwort
  • Tupelstruktur
  • Einführung in Tupel-Header
  • Tupel-Assembly
  • Ende

Vorwort

Dieser Artikel basiert auf der Analyse und Interpretation des Postgresql 14-Codes und wird auf dem Centos8-System demonstriert.


1. Tupelstruktur

 

	 +---------------------+---------------+----------------+
	 | HeapTupleHeaderData |  nulls bitmap | padding        |
	 +------------+--------+---------------+----------------+
	 | object ID  |  value1 value2 value3 ...               |
	 +------------+-----------------------------------------+
  

  Jede in der Datentabelle angezeigte Datenzeile wird in Form eines Tupels auf der Seite gespeichert. Die Struktur des Tupels ist:

 

(1) HeapTupleHeaderData 

(2)nulls bitmap; Dies ist eine Option. Wenn die t_infomask das HEAP_HASNULL- Flag hat , hat dieses Array einen Wert;

(3) padding ; Die Länge der Null-Bitmap vorne ist ungewiss. Um die nachfolgenden Daten auszurichten, ist hier die Byte-Ausrichtung der HeapTupleHeaderData + Nulls-Bitmap, und hier wird ein Leerzeichen angezeigt.

(4) OID-Wert, dies ist eine Option. Wenn t_infomask HEAP_HASOID_OLD hat, hat es diesen Wert;

(5) Benutzerdaten, dh die Daten jeder Spalte;

 

 

2. Einführung in Tupel-Header

 

Struktur HeapTupleHeaderData

{

    Union

    {

        HeapTupleFields t_heap ;

        DateTupleFields t_date ;

    }           t_choice ;

    ItemPointerData t_ctid ;     /* aktuelle TID dieses oder neueren Tupels (oder a

                                 * spekulativer Einfügungs-Token) */

    /* Die Felder hier unten müssen mit MinimalTupleData übereinstimmen! */

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2 2

    uint16      t_infomask2 ;    /* Anzahl der Attribute + verschiedene Flags */

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK 3

    uint16      t_infomask ;     /* diverse Flag-Bits, siehe unten */

#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF 4

    uint8       t_hoff ;         /* Größe des Headers inkl. Bitmap, Auffüllung */

    /* ^ - 23 Bytes - ^ */

#define FIELDNO_HEAPTUPLEHEADERDATA_BITS 5

    bits8       t_bits [ FLEXIBLE_ARRAY_MEMBER ];  /* Bitmap von NULLs */

    /* WEITERE DATEN FOLGEN AM ENDE DER STRUKTUR */

};

  • Feld Beschreibung

(1) t_choice

Die aus der HeapTupleFields- Struktur und der DatumTupleFields- Struktur bestehende Vereinigung kann in den beiden Fällen Tupelkonstruktion und Tupel auf der Seite ausgewählt und verwendet werden und kann nicht gleichzeitig existieren.

 

  • t_data

Diese Struktur muss gefüllt werden, wenn ein Tupel im Speicher erstellt wird. Derzeit sind keine Informationen zur Sichtbarkeitsbeurteilung und zur Parallelitätskontrolle erforderlich.

Strukturbeschreibung:

typedef struct DatumTupleFields

{

    int32 datum_len_;     /* Varlena-Header (nicht direkt berühren!) */

    int32 datum_typmod;   /* -1 oder Bezeichner eines Datensatztyps */

    Oid datum_typeid;   /* zusammengesetzte Typ-OID oder RECORDOID */

    /*

     * datum_typeid kann keine Domäne über zusammengesetzt sein, sondern nur einfach zusammengesetzt.

     * auch wenn das Datum als Wert eines Domain-over-Composite-Typs gedacht ist.

     * Dies steht im Einklang mit dem allgemeinen Grundsatz, dass CoerceToDomain dies nicht tut

     * Ändern Sie die physische Darstellung des Basistypwerts.

     *

     * Hinweis: Die Feldreihenfolge wurde mit dem Gedanken gewählt, dass Oid es eines Tages tun könnte

     * auf 64 Bit erweitern.

     */

} DatumTupleFields ;

 

 

  • t_heap

Diese Struktur muss ausgefüllt werden, wenn das Tupel zur Seite der Tabelle hinzugefügt wird . Konvertieren Sie DatumTupleFields zur Verwendung direkt in die HeapTupleFields- Struktur.

 

Strukturbeschreibung:

typedef struct HeapTupleFields

{

    Transaktions-ID t_xmin;       /* xact ID einfügen */

    Transaktions-ID t_xmax;       /* Xact-ID löschen oder sperren */

    Union

    {

        CommandId t_cid;      /* Befehls-ID einfügen oder löschen oder beides */

        Transaktions-ID t_xvac;   /* VACUUM FULL xact ID im alten Stil */

    } t_field3;

} HeapTupleFields ;

3. Tupelassemblierung

Beim Einfügen/Aktualisieren wird ein neues Tupel zusammengestellt, und dann wird eine Seite mit genügend verbleibendem Platz gefunden und hinzugefügt. Natürlich gibt es bestimmte Strategien, um eine Seite mit ausreichend Platz zu finden, auf die später noch eingegangen wird.

  • Erstellen Sie ein neues Tupel

HeapTuple

heap_form_tuple ( TupleDesc tupleDescriptor ,

                Datum * Werte ,

                bool * istnull ) ;

Berechnen Sie die Länge des Tupels in dieser Schnittstelle, einschließlich der Größe des Werts des Tupelheaders + jeder Attributspalte.

Darüber hinaus muss len auch die Größe der HeapTupleData- Struktur enthalten , in der die Zeilenzeigerdaten und Tupeldaten sowie deren Gesamtlänge aufgezeichnet werden.

 

typedef struct HeapTupleData

{

    uint32      t_len ;          /* Länge von *t_data */

    ItemPointerData t_self ;     /* SelfItemPointer */

    Oid         t_tableOid ;     /* Tabelle, aus der das Tupel stammt */

#define FIELDNO_HEAPTUPLEDATA_DATA 3

    HeapTupleHeader t_data ;     /* -> Tupel-Header und Daten */

} HeapTupleData ;

 

Dann wird t_choice.t_datum von t_data ein Wert zugewiesen , und der Längenwert ist die um 2 Bits nach links verschobene Tupellänge .

  • Tupeloperation

Zuweisungsoperation zu t_choice.t_datum im Tupleheader _ _

HeapTupleHeaderSetDatumLength ( td , len );

HeapTupleHeaderSetTypeId ( td , tupleDescriptor -> tdtypeid );

HeapTupleHeaderSetTypMod ( td , tupleDescriptor -> tdtypmod );

  • Begrenzen Sie die Anzahl der Attributspalten

#define MaxTupleAttributeNumber 1664    /* 8 * 208 */

Beim Erstellen eines Tupels im Speicher wird beurteilt, ob diese Obergrenze überschritten wird

#define MaxHeapAttributeNumber   1600    /* 8 * 200 */

Die maximale Anzahl der Spalten beträgt hier 1600. Wenn das Spaltenfeld lang ist, ist es kleiner als diese Zahl; diese Zahl ist ein bestimmter Spielraum.


Ende

E-Mail des Autors: [email protected]
Wenn es Fehler oder Auslassungen gibt, weisen Sie bitte darauf hin und lernen Sie voneinander.

Hinweis: Nachdruck nicht ohne Zustimmung!

Supongo que te gusta

Origin blog.csdn.net/senllang/article/details/123674067
Recomendado
Clasificación