Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
사설 토토 사이트 : 문서 : 9.3 : 초기화 포크 | PostgreSQL : 문서 : 9.3 : 스포츠 토토 결과 물리적 스토리지 | 58 장. 데이터베이스 물리적 스토리지 | PostgreSQL : 문서 : 9.3 : BKI 백엔드 메이저 토토 사이트 |
이 섹션은 내에서 사용 된 롤 토토 형식의 개요를 제공합니다.postgresql테이블 및 인덱스.[1]시퀀스 및토스트테이블은 단지 포맷됩니다 일반 테이블처럼.
다음 설명에서 a바이트IS 8 비트를 포함한다고 가정합니다. 또한 용어항목개별 데이터 값을 나타냅니다 롤 토토에 저장됩니다. 테이블에서 항목은 행입니다. 색인에서 항목은 색인 항목입니다.
모든 테이블과 인덱스는 배열로 저장됩니다롤 토토고정 크기 (보통 8kb, a 서버를 컴파일 할 때 다른 롤 토토 크기를 선택할 수 있습니다). ~ 안에 테이블, 모든 롤 토토는 논리적으로 동일하므로 특정 항목 (행)은 모든 롤 토토에 저장할 수 있습니다. 인덱스에서 첫 롤 토토는입니다 일반적으로 A로 예약전달보유 정보 제어 및 다른 유형의 롤 토토가있을 수 있습니다. 인덱스 액세스 방법에 따라 인덱스 내에서
표 58-2롤 토토의 전체 레이아웃이 표시됩니다. 각각에는 5 개의 부분이 있습니다 롤 토토.
표 58-2. 전체 롤 토토 레이아웃
항목 | 설명 |
---|---|
PageHeaderData | 24 바이트 길이. 롤 토토에 대한 일반 정보가 포함되어 있습니다. 여유 공간 포인터 포함. |
itemiddata | 실제 항목을 가리키는 (오프셋, 길이) 쌍. 4 항목 당 바이트. |
여유 공간 | 할당되지 않은 공간. 새 항목 포인터는 이 지역의 시작, 끝에서 새로운 항목. |
항목 | 실제 항목 자체. |
특별 공간 | 색인 액세스 방법 특정 데이터. 다른 방법 저장 다른 데이터. 평범한 테이블에서 비어 있습니다. |
각 롤 토토의 첫 24 바이트는 롤 토토 헤더로 구성됩니다. (PageHeaderData). 형식입니다 자세히표 58-3. 그만큼 첫 번째 필드는이 롤 토토와 관련된 최신 WAL 항목을 추적합니다. 두 번째 필드에는 롤 토토 체크섬이 포함되어 있습니다.데이터 체크섬are 활성화. 다음은 플래그 비트를 포함하는 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에서 가장 오래된 Xmax를 추적합니다. 롤 토토.
표 58-3. PageHeaderData 레이아웃
필드 | 타입 | 길이 | 설명 |
---|---|---|---|
PD_LSN | pagexlogrecptr | 8 바이트 | LSN : 마지막 변경을위한 Xlog 레코드의 마지막 바이트 후 다음 바이트 이 롤 토토에 |
PD_CHECKSUM | UINT16 | 2 바이트 | Page CheckSum |
PD_FLAGS | UINT16 | 2 바이트 | 플래그 비트 |
PD_LOWER | LocationIndex | 2 바이트 | 여유 공간의 시작으로 오프셋 |
pd_upper | LocationIndex | 2 바이트 | 여유 공간의 끝으로 오프셋 |
PD_SPECIAL | LocationIndex | 2 바이트 | 특별 공간의 시작으로 오프셋 |
pd_pagesize_version | UINT16 | 2 바이트 | 롤 토토 크기 및 레이아웃 버전 번호 정보 |
PD_PRUNE_XID | TransactionId | 4 바이트 | 롤 토토에 가장 오래된 예측되지 않은 xmax 또는 0이면 0 |
모든 세부 사항은에서 찾을 수 있습니다src/include/storage/bufpage.h.
롤 토토 헤더 다음은 항목 식별자입니다 (itemiddata), 각각 4 바이트가 필요합니다. 항목 식별자는 항목의 시작에 바이트 오프셋을 포함합니다. 바이트의 길이 및 그 영향에 영향을 미치는 몇 가지 속성 비트 해석. 새로운 항목 식별자는 필요에 따라 할당됩니다 할당되지 않은 공간의 시작. 항목 수 존재하는 식별자는 보면 결정할 수 있습니다PD_LOWER, 새로운 것을 할당하기 위해 증가합니다 식별자. 항목 식별자가 그 때까지 이동하지 않기 때문에 Freed, 그 지수는 장기적으로 사용하여 참조 할 수 있습니다. 항목 자체가 롤 토토에서 이동하는 경우에도 소형 여유 공간. 사실, 항목에 대한 모든 포인터 (ItemPointer, 또한CTID) 만들기postgresql로 구성됩니다 롤 토토 번호와 항목 식별자의 색인.
항목 자체는 뒤로 할당 된 공간에 저장됩니다 할당되지 않은 공간의 끝에서. 정확한 구조는 다릅니다 테이블이 포함되어야하는 것에 따라. 테이블 및 시퀀스 둘 다 이름이 지정된 구조를 사용합니다HeappupleHeaderData, 아래 설명.
마지막 섹션은입니다."스페셜 부분"액세스 방법이 원하는 것을 포함 할 수 있습니다 저장합니다. 예를 들어, B-Tree Indexes는 롤 토토에 대한 링크를 저장합니다 왼쪽 및 오른쪽 형제 자매 및 다른 데이터와 관련된 다른 데이터 인덱스 구조. 일반 테이블은 특별 섹션을 사용하지 않습니다 모두 (설정으로 표시PD_SPECIAL롤 토토 크기와 동일).
모든 테이블 행은 같은 방식으로 구성됩니다. A가 있습니다 고정 크기 헤더 (대부분의 기계에서 23 바이트를 차지함) 선택적 NULL 비트 맵, 선택적 객체 ID 필드 및 사용자 데이터. 헤더는에 자세히 설명되어 있습니다.테이블 58-4. 실제 사용자 데이터 (행의 열)는 로 표시된 오프셋t_hoff항상 플랫폼의 Maxalign 거리의 배수입니다. 그만큼 NULL 비트 맵은 만있는 경우에만 존재합니다.Heap_hasnull비트가 설정되었습니다T_INFOMASK. 그것이 존재한다면 그것은 단지 시작됩니다 고정 헤더 후에 한 비트를 가질 수있는 충분한 바이트를 차지한 후 데이터 열 당 (즉,t_natts비트 전부). 이 비트 목록에서 1 비트는 널을 나타내지 않음을 나타냅니다. 비트는 널입니다. 비트 맵이 없으면 모든 열이 있습니다 무감각하지 않다고 가정합니다. 객체 ID는 만있는 경우에만 존재합니다.heap_hasoid비트가 설정되었습니다T_INFOMASK. 존재한다면, 직전에 나타납니다 그만큼t_hoff경계. 모든 패딩 만들어야t_hoffA Maxalign 널 비트 맵과 객체 ID 사이에 여러 가지가 나타납니다. (이것은 객체 ID가 적절하게 정렬되도록합니다.)
표 58-4. HeptupleHeaderData 레이아웃
필드 | 타입 | 길이 | 설명 |
---|---|---|---|
t_xmin | TransactionId | 4 바이트 | XID 스탬프 삽입 |
T_XMAX | TransactionId | 4 바이트 | XID 스탬프 삭제 |
T_CID | CommandId | 4 바이트 | CID 스탬프 삽입 및/또는 삭제 (t_xvac 오버레이) |
T_XVAC | TransactionId | 4 바이트 | xid 진공 조작 행 버전 이동 |
T_CTID | ItemPointerData | 6 바이트 | 현재 또는 새로운 행 버전의 현재 시간 |
T_INFOMASK2 | UINT16 | 2 바이트 | 속성 수, 다양한 플래그 비트 |
T_INFOMASK | UINT16 | 2 바이트 | 다양한 플래그 비트 |
t_hoff | uint8 | 1 바이트 | 사용자 데이터 오프셋 |
모든 세부 사항은에서 찾을 수 있습니다src/include/access/htup_details.h.
실제 데이터 해석은 정보로만 수행 할 수 있습니다. 다른 테이블에서 획득, 대부분pg_attribute. 식별하는 데 필요한 주요 값 필드 위치는attlenandattalign. 직접 할 방법이 없습니다 고정 너비 만있는 경우를 제외하고 특정 속성을 얻으십시오. 필드 및 널 값이 없습니다. 이 모든 속임수는 기능heap_getattr, FastgetAttrandheap_getsysattr.
데이터를 읽으려면 각 속성을 차례로 검사해야합니다. 먼저 널 비트 맵에 따라 필드가 무효인지 확인하십시오. 그렇다면 다음으로 이동하십시오. 그런 다음 옳은지 확인하십시오 조정. 필드가 고정 너비 필드 인 경우 모든 바이트 간단히 배치됩니다. 가변 길이 필드 인 경우 (attlen = -1) 그런 다음 조금 더 복잡합니다. 모든 변수 길이 데이터 유형 공통 헤더 구조 공유struct Varlena, 여기에는 저장된 값의 총 길이가 포함됩니다. 그리고 일부 깃발 비트. 플래그에 따라 데이터도 가능합니다 인라인 또는 A토스트테이블; 그것 압축 될 수 있습니다 (참조섹션 58.2).
[1] |
실제로 인덱스 액세스 방법은이 롤 토토 형식을 사용할 필요가 없습니다. 모든 기존 인덱스 방법은이 기본 형식을 사용하지만 인덱스 메타지에 보관 된 데이터는 일반적으로 항목 레이아웃을 따르지 않습니다. 규칙. |