이 섹션은에 대한 개요를 제공합니다.토롤 토토(대형 부여 저장 기술).
PostgreSQL고정 페이지 크기 (일반적으로 8kb)를 사용하며 튜플이 여러 페이지에 걸쳐 있지 않습니다. 따라서 매우 큰 필드 값을 직접 저장할 수 없습니다.토롤 토토(또는“얇게 썬 빵 이후 가장 좋은 것”). 그만큼토롤 토토인프라는 메모리에서 큰 데이터 값의 처리를 개선하는 데 사용됩니다.
특정 데이터 유형 만 지원토롤 토토- 큰 필드 값을 생성 할 수없는 데이터 유형에 오버 헤드를 부과 할 필요가 없습니다. 지원하려면토롤 토토, 데이터 유형에는 가변 길이가 있어야합니다 (Varlena) 표현은 일반적으로 저장된 값의 처음 4 바이트 단어에 바이트의 총 길이 (자체 포함)를 포함합니다..토롤 토토나머지 데이터 유형의 표현을 제한하지 않습니다. 특별한 표현은 총체적으로토롤 토토ed 값이 초기 길이 단어를 수정하거나 재 해석하여 작업하십시오. 따라서 A를 지원하는 C 수준 기능토롤 토토-가능한 데이터 유형이 잠재적으로 처리하는 방법에주의해야합니다토롤 토토ED 입력 값 : 입력은 실제로 4 바이트 길이의 단어와 내용으로 구성되지 않을 수 있습니다.Detoasted. (이것은 일반적으로 호출하여 수행됩니다PG_DETOAST_DATUM
입력 값을 가진 작업을 수행하기 전에 더 효율적인 접근 방식이 가능합니다. 보다섹션 36.13.1자세한 내용은.)
토롤 토토varlena 길이 단어의 두 비트 (빅 엔디 언 기계의 고차 비트, 작은 엔디 언 기계의 저음 비트)의 두 비트를 사용하여 A의 모든 값의 논리적 크기를 제한합니다.토롤 토토-가능한 데이터 유형에서 1GB (230-1 바이트). 두 비트가 모두 0이면 값은 평범한 un-입니다.토롤 토토데이터 유형의 ED 값 및 길이 단어의 나머지 비트는 총 데이텀 크기 (길이 단어 포함)를 바이트로 제공합니다. 가장 높은 주문 또는 가장 낮은 주문 비트가 설정되면 값은 일반 4 바이트 헤더 대신 단일 바이트 헤더 만 있으며 해당 바이트의 나머지 비트는 총 기준 크기 (길이 바이트 포함)를 바이트로 제공합니다.토롤 토토 포인터는 데이텀의 두 번째 바이트에 저장된 코드에 의해 결정됩니다. 마지막으로, 가장 높은 주문 또는 가장 낮은 비트가 명확하지만 인접한 비트가 설정되면, 데이텀의 내용이 압축되어 사용하기 전에 압축을 압축해야합니다.토롤 토토포인터는 대신 그 말을합니다.
인라인 또는 외부 압축 데이터에 사용되는 압축 기술은 각 열에 대해를 설정하여 선택할 수 있습니다압축
열 옵션테이블 생성
또는Alter Table
. 명시 적 설정이없는 열의 기본값은를 참조하는 것입니다.default_toast_compression시간 데이터의 매개 변수가 삽입되었습니다.
언급했듯이 여러 유형의가 있습니다.토롤 토토포인터 데이텀. 가장 오래되고 가장 일반적인 유형은 A에 저장된 외부 데이터에 대한 포인터입니다.토롤 토토테이블그것은를 포함하는 테이블과는 별개이지만 관련이 있지만 관련이 있습니다.토롤 토토포인터 데이텀 자체. 이것들온 디스크포인터 데이텀은토롤 토토관리 코드 (inAccess/Common/Toast_internals.c
) 디스크에 저장 될 튜플이 너무 커서 저장하기에는 저장 될 수 없습니다. 자세한 내용은에 나타납니다.섹션 65.2.1. 또는 A토롤 토토포인터 데이텀에는 메모리의 다른 곳에 나타나는 외부 데이터에 대한 포인터가 포함될 수 있습니다. 이러한 데이텀은 반드시 수명이 짧으며, 온 디스크처럼 보이지 않지만 큰 데이터 값의 복사 및 중복 처리를 피하는 데 매우 유용합니다.섹션 65.2.2.
테이블의 열이있는 경우토롤 토토-가능, 테이블에는 관련이 있습니다토롤 토토테이블, OID가 테이블에 저장되어 있습니다pg_class
.reltoastrelid
입력. 온 디스크토롤 토토ed 값은에 보관됩니다.토롤 토토테이블, 아래에 자세히 설명 된대로.
외부 값이 나뉘어져 있습니다 (사용하면 압축 후) 최대 청크로TOAST_MAX_CHUNK_SIZE
바이트 (기본적 으로이 값은 4 개의 청크 행이 페이지에 맞도록 선택되어 약 2000 바이트가됩니다). 각 청크는에 별도의 행으로 저장됩니다.토롤 토토소유 테이블에 속하는 테이블. 모든토롤 토토테이블은 열이 있습니다chunk_id
(특정을 식별하는 OID토롤 토토ed value),chunk_seq
(값 내에서 청크의 시퀀스 번호) 및chunk_data
(청크의 실제 데이터). 독특한 색인chunk_id
andchunk_seq
값을 빠르게 검색합니다. 외부 온 디스크를 나타내는 포인터 데이텀토롤 토토ed 값은의 OID를 저장해야합니다.토롤 토토특정 값의 외관 및 OID 테이블 (ITSchunk_id
). 편의를 위해, 포인터 데이텀은 논리적 데이텀 크기 (원래 압축되지 않은 데이터 길이), 물리적 저장 크기 (압축이 적용되는 경우) 및 사용 된 압축 방법을 저장합니다.토롤 토토Pointer Datum은 대표 값의 실제 크기에 관계없이 18 바이트입니다.
the토롤 토토관리 코드는 테이블에 저장 될 행 값이보다 넓은 경우에만 트리거됩니다TOAST_TUPLE_THRESHOLD
바이트 (일반적으로 2 kb). 그만큼토롤 토토코드는 행 값이 |TOAST_TUPLE_TARGET
바이트 (일반적으로 2 kb, 조정 가능) 또는 더 이상 이익을 얻을 수 없습니다. 업데이트 작업 중에 변경되지 않은 필드의 값은 일반적으로 AS-IS로 보존됩니다.토롤 토토불가능한 값이 변경되지 않으면 비용.
the토롤 토토관리 코드는 저장을위한 4 가지 전략을 인식합니다토롤 토토-디스크의-가능한 열 :
일반
압축 또는 외부 스토리지를 방지합니다. 이것은 비의 열에 대한 유일한 전략입니다.토롤 토토-가능한 데이터 유형.
확장
압축 및 외부 저장 공간을 모두 허용합니다. 이것은 대부분의 기본입니다토롤 토토-가능한 데이터 유형. 압축이 먼저 시도되고 행이 너무 커지면 외부 저장소가 있습니다.
외부
외부 저장소는 허용하지만 압축은 허용되지 않습니다. 사용외부
wide에서 서브 롤 토토링 작업을 할 것입니다텍롤 토토
andBYTEA
열이 더 빠르며 (저장 공간의 페널티에서) 이러한 작업은 압축되지 않은 경우 외부 값의 필요한 부분 만 가져 오도록 최적화되기 때문에 (.
Main
압축은 허용하지만 외부 저장 공간은 허용되지 않습니다. (실제로, 외부 스토리지는 그 열에 대해 여전히 수행 될 것이지만, 페이지에 맞게 행을 작게 만들 수있는 다른 방법이없는 경우에만 최후의 수단으로 만 수행됩니다.)
각토롤 토토-가능한 데이터 유형 해당 데이터 유형의 열에 대한 기본 전략을 지정하지만 주어진 테이블 열에 대한 전략은로 변경 될 수 있습니다.ALTER 테이블 ... 스토리지 설정
.
TOAST_TUPLE_TARGET
를 사용하여 각 테이블에 대해 조정할 수 있습니다ALTER 테이블 ... 세트 (TOAST_TUPLE_TARGET = N)
이 체계는 행 값이 페이지에 걸쳐있는 것과 같은보다 간단한 접근 방식과 비교하여 여러 가지 장점이 있습니다. 쿼리가 일반적으로 비교적 작은 키 값과 비교하여 자격이 있다고 가정하면, 유언 집행자의 대부분의 작업은 메인 행 항목을 사용하여 수행됩니다.토롤 토토ed 속성은 결과 세트가 클라이언트로 전송 될 때만 (선택된 경우) 만 꺼집니다 (전혀 선택한 경우). 따라서 메인 테이블은 훨씬 작으며 공유 버퍼 캐시에 적합한 줄이없는 저장소가없는 경우보다 더 많은 행이 공유 버퍼 캐시에 적합합니다.토롤 토토테이블, 그리고 메인 테이블에는 전체 데이터의 약 10% (URL 및 일부 작은 HTML 페이지)가 포함되어 있습니다. UN-에 비해 실행 시간 차이가 없었습니다.토롤 토토ed 비교 테이블, 모든 HTML 페이지가 7kb로 잘라 내기.
토롤 토토포인터는 디스크에 있지 않지만 현재 서버 프로세스의 메모리의 다른 곳에있는 데이터를 가리킬 수 있습니다. 그러한 포인터는 분명히 오래 지속될 수는 없지만 그럼에도 불구하고 유용합니다.Indirect데이터 및 포인터 to확장데이터.
간접토롤 토토포인터는 단순히 메모리 어딘가에 저장된 비 종교적 Varlena 값을 가리 킵니다. 이 사례는 원래 개념 증명으로 만 생성되었지만 현재 논리적 디코딩 중에 1GB를 초과하는 물리적 튜플을 생성하지 않도록 현재 사용되어 있습니다 (모든 라인 외 필드 값을 튜플로 끌어 당기는 것이 가능함에 따라).
확장토롤 토토포인터는 온 디스크 표현이 계산 목적에 특히 적합하지 않은 복잡한 데이터 유형에 유용합니다. 예를 들어, a의 표준 varlena 표현PostgreSQL배열에는 차원 정보, NULLS 비트 맵이 포함되어있는 경우 널 요소가 있으면 모든 요소의 값이 순서대로 포함됩니다. 요소 유형 자체가 가변 길이 인 경우를 찾는 유일한 방법입니다.N
'th 요소는 이전의 모든 요소를 스캔하는 것입니다. 이 표현은 컴팩트 함 때문에 온 디스크 스토리지에 적합하지만 배열로 계산하려면“확장”또는“해체”모든 요소 시작 위치가 식별 된 표현. 그만큼토롤 토토포인터 메커니즘은 Pass-by-reference Datum이 표준 Varlena 값 (온 디스크 표현) 또는 a를 가리키도록함으로써 이러한 요구를 지원합니다.토롤 토토메모리 어딘가에 확장 된 표현을 가리키는 포인터. 이 확장 된 표현의 세부 사항은 데이터 유형에 달려 있지만 표준 헤더가 있어야하며에 제공된 다른 API 요구 사항을 충족해야합니다.src/include/utils/expededdatum.h
. 데이터 유형으로 작업하는 C 수준 기능은 두 가지 표현을 처리하도록 선택할 수 있습니다.PG_DETOAST_DATUM
입력에 대한 기존의 Varlena 표현을 자동으로받습니다. 따라서 확장 된 표현에 대한 지원은 한 번에 하나의 기능을 점차적으로 도입 할 수 있습니다.
토롤 토토확장 된 값에 대한 포인터는 더욱 분해됩니다읽기 쓰기and읽기 전용포인터. 뾰족한 표현은 어느 쪽이든 동일하지만, 읽기 쓰기 포인터를 수신하는 함수는 참조 된 값을 장소에서 수정할 수 있지만, 읽기 전용 포인터를 수신하는 것은 안됩니다.
모든 유형의 인 메모리토롤 토토포인터,토롤 토토관리 코드는 그러한 포인터 데이텀이 실수로 디스크에 저장 될 수 없도록합니다. 인 메모리토롤 토토포인터는 저장 전에 정상 인라인 Varlena 값으로 자동 확장 된 다음 ON-Disk로 변환 될 수 있습니다토롤 토토포인터, 튜플이 너무 큰 경우
올바르지 않은 문서에 아무것도 표시되면 일치하지 않습니다.이 양식문서 문제를보고하려면