이 섹션은 내부에서 사용되는 젠 토토 형식의 개요를 제공합니다.포스트그레SQL테이블 및 색인.[17]시퀀스 및토스트테이블은 일반 테이블과 마찬가지로 형식이 지정됩니다.
다음 설명에서 a바이트8비트를 포함하는 것으로 가정됩니다. 또한, 용어항목은 젠 토토에 저장된 개별 데이터 값을 나타냅니다. 테이블에서 항목은 행입니다. 색인에서 항목은 색인 항목입니다.
모든 테이블과 인덱스는 배열로 저장됩니다.젠 토토고정 크기(일반적으로 8kB, 서버를 컴파일할 때 다른 젠 토토 크기를 선택할 수 있음). 테이블에서는 모든 젠 토토가 논리적으로 동일하므로 특정 항목(행)이 모든 젠 토토에 저장될 수 있습니다. 인덱스에서 첫 번째 젠 토토는 일반적으로 다음과 같이 예약됩니다.메타젠 토토제어 정보를 보유하고 있으며 색인 액세스 방법에 따라 색인 내에 다양한 유형의 젠 토토가 있을 수 있습니다.
표 65.2젠 토토의 전체 레이아웃을 보여줍니다. 각 젠 토토에는 5개의 부분이 있습니다.
표 65.2. 전체 젠 토토 레이아웃
| 항목 | 설명 |
|---|---|
| 젠 토토헤더데이터 | 길이는 24바이트입니다. 여유 공간 포인터를 포함하여 젠 토토에 대한 일반 정보가 포함되어 있습니다. |
| ItemIdData | 실제 항목을 가리키는 항목 식별자 배열. 각 항목은 (오프셋, 길이) 쌍입니다. 항목당 4바이트입니다. |
| 여유 공간 | 할당되지 않은 공간입니다. 이 영역의 시작부터 새 항목 식별자가 할당되고 끝부터 새 항목이 할당됩니다. |
| 항목 | 실제 항목 자체. |
| 특수 공간 | 인덱스 액세스 방법별 데이터. 다양한 방법으로 다양한 데이터를 저장합니다. 일반 테이블에서는 비어 있습니다. |
각 젠 토토의 처음 24바이트는 젠 토토 헤더(젠 토토헤더데이터). 그 형식은 다음에 자세히 설명되어 있습니다.표 65.3. 첫 번째 필드는 이 젠 토토와 관련된 가장 최근 WAL 항목을 추적합니다. 두 번째 필드에는 다음과 같은 경우 젠 토토 체크섬이 포함됩니다.데이터 체크섬활성화되었습니다. 다음은 플래그 비트를 포함하는 2바이트 필드입니다. 그 뒤에는 3개의 2바이트 정수 필드()가 옵니다.pd_lower, pd_upper및pd_special). 여기에는 젠 토토 시작부터 할당되지 않은 공간의 시작, 할당되지 않은 공간의 끝, 특수 공간의 시작까지의 바이트 오프셋이 포함됩니다. 젠 토토 헤더의 다음 2바이트,pd_pagesize_version, 젠 토토 크기와 버전 표시를 모두 저장합니다. 로 시작PostgreSQL8.3 버전 번호는 4입니다.PostgreSQL8.1 및 8.2에서는 버전 번호 3을 사용했습니다.PostgreSQL8.0은 버전 번호 2를 사용했습니다.PostgreSQL7.3 및 7.4에서는 버전 번호 1을 사용했습니다. 이전 릴리스에서는 버전 번호 0을 사용했습니다. (기본 젠 토토 레이아웃과 헤더 형식은 대부분의 버전에서 변경되지 않았지만 힙 행 헤더의 레이아웃은 변경되었습니다.) 젠 토토 크기는 기본적으로 교차 확인으로만 표시됩니다. 설치 시 둘 이상의 젠 토토 크기를 지원하지 않습니다. 마지막 필드는 젠 토토 정리가 수익성이 있는지 여부를 보여주는 힌트입니다. 젠 토토에서 정리되지 않은 가장 오래된 XMAX를 추적합니다.
표 65.3. PageHeader데이터 레이아웃
| 필드 | 유형 | 길이 | 설명 |
|---|---|---|---|
| pd_lsn | PageXLogRecPtr | 8바이트 | LSN: 이 젠 토토의 마지막 변경에 대한 WAL 레코드의 마지막 바이트 다음 바이트 |
| pd_checksum | uint16 | 2바이트 | 젠 토토 체크섬 |
| pd_flags | 단위16 | 2바이트 | 플래그 비트 |
| pd_lower | 위치 인덱스 | 2바이트 | 여유 공간 시작 오프셋 |
| pd_upper | 위치색인 | 2바이트 | 여유 공간 끝까지 오프셋 |
| pd_special | 위치색인 | 2바이트 | 특수 공간 시작 오프셋 |
| pd_pagesize_version | 단위16 | 2바이트 | 젠 토토 크기 및 레이아웃 버전 번호 정보 |
| pd_prune_xid | 거래 ID | 4바이트 | 젠 토토에서 정리되지 않은 가장 오래된 XMAX, 없는 경우 0 |
모든 세부정보는 다음에서 찾을 수 있습니다.src/include/storage/bufpage.h.
젠 토토 헤더 다음에는 항목 식별자가 있습니다(ItemIdData), 각각 4바이트가 필요합니다. 항목 식별자에는 항목 시작 부분의 바이트 오프셋, 바이트 길이, 해석에 영향을 미치는 몇 가지 속성 비트가 포함됩니다. 할당되지 않은 공간의 시작 부분부터 필요에 따라 새 항목 식별자가 할당됩니다. 존재하는 항목 식별자의 수는 다음을 확인하여 확인할 수 있습니다.pd_lower, 새로운 식별자를 할당하기 위해 증가됩니다. 항목 식별자는 해제될 때까지 이동되지 않으므로 항목 자체가 젠 토토에서 여유 공간을 압축하기 위해 이동되는 경우에도 항목을 참조하기 위해 해당 인덱스를 장기적으로 사용할 수 있습니다. 실제로 항목에 대한 모든 포인터(아이템포인터,라고도 함CTID) 작성자:포스트그레SQL젠 토토 번호와 항목 식별자의 색인으로 구성됩니다.
항목 자체는 할당되지 않은 공간의 끝에서 뒤쪽으로 할당된 공간에 저장됩니다. 정확한 구조는 테이블에 포함되는 내용에 따라 달라집니다. 테이블과 시퀀스는 모두라는 구조를 사용합니다.HeapTupleHeaderData, 아래에 설명되어 있습니다.
마지막 섹션은“특별 섹션”액세스 방법이 저장하려는 모든 것을 포함할 수 있습니다. 예를 들어, B-트리 인덱스는 젠 토토의 왼쪽 및 오른쪽 형제에 대한 링크뿐만 아니라 인덱스 구조와 관련된 기타 데이터를 저장합니다. 일반 테이블은 특수 섹션을 전혀 사용하지 않습니다(설정으로 표시됨)pd_special젠 토토 크기와 동일하게 함).
그림 65.1이러한 부분이 젠 토토에 어떻게 배치되어 있는지 보여줍니다.
그림 65.1. 젠 토토 레이아웃
모든 테이블 행은 동일한 방식으로 구성됩니다. 고정 크기 헤더(대부분의 컴퓨터에서 23바이트를 차지함)가 있고 그 뒤에 선택적 null 비트맵, 선택적 개체 ID 필드 및 사용자 데이터가 있습니다. 헤더에 대한 자세한 내용은표 65.4. 실제 사용자 데이터(행의 열)는 다음과 같이 표시된 오프셋에서 시작됩니다.t_hoff, 이는 항상 플랫폼 MAXALIGN 거리의 배수여야 합니다. null 비트맵은 다음과 같은 경우에만 존재합니다.HEAP_HASNULL비트가 설정되었습니다.t_infomask. 존재하는 경우 고정 헤더 바로 뒤에서 시작하고 데이터 열당 1비트(즉, 속성 수와 동일한 비트 수)를 가질 만큼 충분한 바이트를 차지합니다.t_infomask2). 이 비트 목록에서 1비트는 null이 아님을 나타내고 0비트는 null을 나타냅니다. 비트맵이 없으면 모든 열은 null이 아닌 것으로 간주됩니다. 객체 ID는 다음과 같은 경우에만 존재합니다.HEAP_HASOID_OLD비트가 설정되었습니다t_infomask. 존재하는 경우, 바로 앞에 나타납니다.t_hoff경계. 만드는 데 필요한 모든 패딩t_hoffMAXALIGN 다중은 널 비트맵과 객체 ID 사이에 나타납니다. (이렇게 하면 개체 ID가 적절하게 정렬됩니다.)
표 65.4. HeapTupleHeader데이터 레이아웃
| 필드 | 유형 | 길이 | 설명 |
|---|---|---|---|
| t_xmin | 거래 ID | 4바이트 | XID 스탬프 삽입 |
| t_xmax | 거래 ID | 4바이트 | XID 스탬프 삭제 |
| t_cid | CommandId | 4바이트 | CID 스탬프 삽입 및/또는 삭제(t_xvac와 오버레이) |
| t_xvac | 거래 ID | 4바이트 | 행 버전을 이동하는 VACUUM 작업을 위한 XID |
| t_ctid | ItemPointerData | 6바이트 | 이 또는 최신 행 버전의 현재 TID |
| t_infomask2 | uint16 | 2바이트 | 속성 수 및 다양한 플래그 비트 |
| t_infomask | uint16 | 2바이트 | 다양한 플래그 비트 |
| t_hoff | 단위8 | 1바이트 | 사용자 데이터로 오프셋 |
모든 세부정보는 다음에서 찾을 수 있습니다.src/include/access/htup_details.h.
실제 데이터 해석은 대부분 다른 테이블에서 얻은 정보로만 수행될 수 있습니다.pg_attribute. 필드 위치를 식별하는 데 필요한 키 값은 다음과 같습니다.아틀렌그리고부착. 고정 너비 필드만 있고 Null 값이 없는 경우를 제외하고는 특정 속성을 직접 가져올 수 있는 방법이 없습니다. 이 모든 속임수는 함수에 포함되어 있습니다.heap_getattr, fastgetattr그리고heap_getsysattr.
데이터를 읽으려면 각 속성을 차례로 조사해야 합니다. 먼저 널 비트맵에 따라 필드가 NULL인지 확인하십시오. 그렇다면 다음으로 이동하세요. 그런 다음 올바르게 정렬되었는지 확인하십시오. 필드가 고정 너비 필드인 경우 모든 바이트가 단순히 배치됩니다. 가변 길이 필드(attlen = -1)라면 좀 더 복잡해집니다. 모든 가변 길이 데이터 유형은 공통 헤더 구조를 공유합니다.struct varlena, 여기에는 저장된 값의 전체 길이와 일부 플래그 비트가 포함됩니다. 플래그에 따라 데이터는 인라인이거나토스트테이블; 압축될 수도 있습니다(참조)섹션 65.2).
[17]실제로, 이 젠 토토 형식의 사용은 테이블 또는 인덱스 액세스 방법에 필요하지 않습니다.힙테이블 액세스 방법은 항상 이 형식을 사용합니다. 기존의 모든 색인 방법도 기본 형식을 사용하지만 색인 메타젠 토토에 보관된 데이터는 일반적으로 항목 레이아웃 규칙을 따르지 않습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.