Esta sección proporciona una visión general del formato de página utilizado por las clases de Postgres. Los métodos de acceso definidos por el usuario no necesitan utilizar este formato de página.
En la siguiente explicación, se asume que un byte contiene 8 bits. Además, el término campo se refiere a los datos almacenados en una clase de Postgres.
La siguiente tabla muestra como están estructuradas las páginas tanto en las clases normales de Postgres como en las clases de índices de Postgres (es decir, un índice B-tree).
Tabla 1. Muestra de Dibujo de Página
Campo | Descripción |
---|---|
Puntero a Datos (ItemPointerData) | |
Espacio Libre (filler) | |
Campo de datos.... | |
Espacio desocupado | |
Campo de Continuación de Datos (ItemContinuationData) | |
Espacio Especial | |
``Campo de datos 2'' | |
``Campo de datos 1'' | |
Datos de Identificación de Campo (ItemIdData) | |
Datos de Cabecera de Página (PageHeaderData) |
Los primeros 8 bytes de cada página consiten en la cabecera de la página (PpageHeaderData). Dentro de la cabecera, los primeros tres campos enteros de 2 bytes (menor, mayor y especial) representan bytes que reflejan el principio del espacio desocupado, el final del espacio desocupado, y el principio del espacio especial. El espacio especial es una región al final de la página que se ocupa en la inicialización de la página y que contiene información específica sobre un método de acceso. Los dos últimos 2 bytes de la cabecera de página, opaco, codifica el tamaño de la página e información sobre la fragmentación interna de la misma. El tamaño de la página se almacena en cada una de ellas, porque las estructuras del pool de buffers pueden estar subdivididas en una forma estructura por estructura dentro de una clase. La información sobre la fragmentación interna se utiliza para ayudar a determinar cuando debería realizarse la reorganización de la página.
Siguiendo a la cabecera de la página están los identificadores de campo (ItemIdData). Se situan nuevos identificadores de campo a partir de los primeros cuatro bytes de espacio libre. Debido a que un identificador de campo nonca se mueve hasta que se elimina, este índice se puede utilizar para indicar la situación de un campo en l apágina. De hecho, cada puntero a un campo (ItemPointer) creado por Postgres consiste en un número de estructura y un índice de un identificador de campo. Un identificador de campo contiene un byte de referencia al principio de un campo, su longitud en bytes, y un conjunto de bits de atributos que pueden afectar a su interpretación.
Los campos mismos están almacenados en un espacio situado más allá del final del espacio libre. Habitualmente, los campos no son interpretados. Sin embargo, cuando el campo es demasiado largo para ser situado en una única página o cuando se desea la fragmentación del campo, éste mismo se divide y cada parte se manipula como campos distintos de la siguiente manera. Cada una de las partes en que se descompone se situa en una estructura de continuación de campo (ItemContinuationData). Esta estructura contiene un puntero (ItemPointerData) hacia la siguiente parte. La última de estas partes se manipula normalmente.