이 섹션은에 사용 된 범퍼카 토토 형식의 개요를 제공합니다.PostgreSQL테이블 및 인덱스. (인덱스 액세스 방법은이 페이지 형식을 사용할 필요가 없습니다. 현재 모든 인덱스 방법은이 기본 형식을 사용하지만 유지 된 데이터는 인덱스 메타지는 일반적으로 항목 레이아웃 규칙을 따르지 않습니다 정확히.) 토스트 테이블과 시퀀스는 일반 테이블.
다음 설명에서 A바이트는 8 비트를 포함한다고 가정합니다. 또한 용어항목개별 데이터 값을 나타냅니다 페이지에 저장됩니다. 테이블에서 항목은 튜플 (행)입니다. 에서 색인, 항목은 색인 항목입니다.
표 7-1기본을 보여줍니다 범퍼카 토토 레이아웃. 각 범퍼카 토토에는 5 개의 부분이 있습니다.
표 7-1. 샘플 페이지 레이아웃
항목 | 설명 |
---|---|
PageHeaderData | 20 바이트 길이. 에 대한 일반 정보가 포함되어 있습니다 여유 공간 포인터를 포함한 페이지. |
itemiddata | 실제 (오프셋, 길이) 쌍 쌍을 실제를 가리키는 배열 항목. |
여유 공간 | 할당되지 않은 공간. 모든 새로운 튜플이 할당됩니다 여기에서 일반적으로 끝까지. |
품목 | 실제 항목 자체. |
특별 공간 | 색인 액세스 방법 특정 데이터. Different methods 다른 데이터를 저장하십시오. 평범한 테이블에서 비어 있습니다. |
각 페이지의 처음 20 바이트는 페이지 헤더로 구성됩니다. (PageHeaderData). 형식은에 자세히 설명되어 있습니다.표 7-2. 처음 두 필드는 WAL 관련 물건을 다룹니다. 다음은 3 개가 뒤 따릅니다 2 바이트 정수 필드 (PD_LOWER, pd_upper및pd_special). 이것들은 바이트 오프셋을 나타냅니다 할당되지 않은 공간의 시작, 할당되지 않은 공간이 끝날 때까지 그리고 특별한 공간의 시작까지.
표 7-2. PageHeaderData 레이아웃
필드 | 타입 | 길이 | 설명 |
---|---|---|---|
PD_LSN | xlogrecptr | 8 바이트 | LSN : XLOG의 마지막 바이트 이후 다음 바이트 |
PD_SUI | startupid | 4 바이트 | 마지막 변경의 Sui (현재는 힙에 의해 사용됩니다. 오직) |
PD_LOWER | LocationIndex | 2 바이트 | 여유 공간의 시작으로 오프셋. |
pd_upper | LocationIndex | 2 바이트 | 여유 공간 끝으로 오프셋. |
pd_special | LocationIndex | 2 바이트 | 특별 공간의 시작으로 오프셋. |
pd_pagesize_version | UINT16 | 2 바이트 | 범퍼카 토토 크기 및 레이아웃 버전 번호 정보. |
모든 세부 사항이 있습니다 src/include/storage/bufpage.h.
특별 공간은 페이지 끝에있는 영역입니다. 페이지 초기화 시간에 할당되며 정보가 포함되어 있습니다 액세스 방법에만 해당됩니다. 페이지의 마지막 2 바이트 헤더,pd_pagesize_version, 저장 범퍼카 토토 크기와 버전 표시기가 모두 있습니다. 부터 시작PostgreSQL7.3 버전 숫자는 1입니다. 사전 릴리스 중고 버전 번호 0 (기본 페이지 레이아웃 및 헤더 형식은 변경되지 않았지만 레이아웃은 힙 튜플 헤더가 있습니다.) 페이지 크기는 기본적으로 존재합니다. 교차 점검으로; 둘 이상의 지원에 대한 지원은 없습니다 설치의 페이지 크기.
페이지 헤더 다음은 항목 식별자입니다 (itemiddata), 각각 4 바이트가 필요합니다. 항목 식별자는 항목의 시작에 바이트 오프셋을 포함합니다. 바이트의 길이 및 그 영향에 영향을 미치는 일련의 속성 비트 해석. 새로운 항목 식별자는 필요에 따라 할당됩니다 할당되지 않은 공간의 시작. 항목 수 존재하는 식별자는 보면 결정할 수 있습니다PD_LOWER, 새로운 것을 할당하기 위해 증가합니다 식별자. 항목 식별자가 그 때까지 이동하지 않기 때문에 해방 된 지수는 장기적으로 사용하여 항목 자체가 페이지에서 이동하는 경우에도 소형 여유 공간. 사실, 항목에 대한 모든 포인터 (ItemPointer, 또한CTID) 생성PostgreSQL페이지 번호와 항목 식별자의 색인.
항목 자체는 뒤로 할당 된 공간에 저장됩니다 할당되지 않은 공간의 끝에서. 정확한 구조는 다릅니다 테이블이 포함되어야하는 것에 따라. 테이블 및 시퀀스 둘 다 이름이 지정된 구조를 사용합니다HeappupleHeaderData, 아래 설명.
마지막 섹션은 "특별 섹션"입니다. 액세스 방법이 저장하려는 모든 것. 일반 테이블이 있습니다 이것을 전혀 사용하지 마십시오 (설정으로 표시pd_specialPagesize와 동일).
모든 테이블 튜플은 같은 방식으로 구성됩니다. A가 있습니다 고정 크기 헤더 (대부분의 기계에서 23 바이트를 차지함) 선택적 NULL 비트 맵, 선택적 객체 ID 필드 및 사용자 데이터. 헤더는에 자세히 설명되어 있습니다.표 7-3. 실제 사용자 데이터 (튜플 필드)는로 표시된 오프셋에서 시작됩니다.t_hoff플랫폼의 Maxalign 거리의 배수. 널 비트 맵은 인 경우에만 존재합니다.Heap_hasnull비트가 설정되었습니다T_INFOMASK. 그것이 존재한다면 그것은 단지 시작됩니다 고정 헤더 후에 한 비트를 가질 수있는 충분한 바이트를 차지한 후 데이터 열 당 (즉,t_natts비트 모두). 이 비트 목록에서 1 비트가 나타납니다 널이 아니라 0 비트는 널입니다. 비트 맵이 없을 때 모두 열은 널이 아닌 것으로 가정합니다. 객체 ID는 경우에만 존재합니다 그만큼heap_hasoid비트가 설정되었습니다T_INFOMASK. 존재한다면, 직전에 나타납니다 그만큼t_hoff경계. 모든 패딩 만들어야t_hoffMaxalign 널 비트 맵과 객체 ID 사이에 여러 가지가 나타납니다. (이것은 객체 ID가 적절하게 정렬.)
표 7-3. HeptupleHeaderData 레이아웃
필드 | 타입 | 길이 | 설명 |
---|---|---|---|
t_xmin | TransactionId | 4 바이트 | XID 스탬프 삽입 |
t_cmin | CommandId | 4 바이트 | CID 스탬프 삽입 (t_xmax로 오버레이) |
t_xmax | TransactionId | 4 바이트 | XID 스탬프 삭제 |
T_CMAX | CommandId | 4 바이트 | CID 스탬프 삭제 (T_XVAC 오버레이) |
T_XVAC | TransactionId | 4 바이트 | 진공 작동을위한 xid |
T_CTID | ItemPointerData | 6 바이트 | 이 또는 새로운 튜플의 현재 시간 |
t_natts | int16 | 2 바이트 | 속성 수 |
T_INFOMASK | UINT16 | 2 바이트 | 다양한 깃발 |
t_hoff | uint8 | 1 바이트 | 사용자 데이터 오프셋 |
모든 세부 사항은 src/include/access/htup.h.에서 찾을 수 있습니다.
실제 데이터 해석은 정보로만 수행 할 수 있습니다. 다른 테이블에서 획득, 대부분pg_attribute. 특정 필드는attlenandattalign. 직접 얻을 방법이 없습니다 고정 너비 만있는 경우를 제외하고 특정 속성 필드 및 널 없음. 이 모든 속임수는 기능heap_getattr, FastgetAttr및heap_getsysattr.
데이터를 읽으려면 각 속성을 차례로 검사해야합니다. 먼저 널에 따라 필드가 무효인지 확인하십시오. 비트 맵. 그렇다면 다음으로 이동하십시오. 그런 다음 당신이 가지고 있는지 확인하십시오 올바른 정렬. 필드가 고정 너비 필드 인 경우 바이트는 간단하게 배치됩니다. 가변 길이 필드 인 경우 (attlen == -1) 그러면 조금 더 복잡합니다. 가변 길이 구조varattrib. 플래그에 따라 데이터가 인라인, 압축 될 수 있습니다. 또는 다른 테이블 (토스트).