이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 65.2. 토범퍼카 토토버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

53.2. 토스트

이 섹션은 다음에 대한 개요를 제공합니다.토스트(대형 속성 저장소 기술).

포스트그레SQL고정 페이지를 사용합니다 크기(일반적으로 8kB)이며 튜플이 여러 개에 걸쳐 있는 것을 허용하지 않습니다. 페이지. 따라서 매우 큰 필드를 저장할 수 없습니다. 가치를 직접적으로 평가합니다. 이러한 한계를 극복하기 위해 큰 필드 값 여러 물리적 행으로 압축 및/또는 분할됩니다. 이 사용자에게 투명하게 발생하며 대부분의 경우에는 작은 영향만 미칩니다. 백엔드 코드의 이 기술은 애칭으로 알려져 있습니다.토스트(또는"얇게 썬 빵 이후로 가장 좋은 것은").

특정 데이터 유형만 지원토스트— 강요할 필요가 없습니다. 큰 필드 값을 생성할 수 없는 데이터 유형에 대한 오버헤드입니다. 받는 사람 지원토스트, 토토 사이트 유형 가변 길이(발레나) 저장된 모든 단어의 첫 번째 32비트 단어를 나타내는 표현입니다. 값에는 값의 전체 길이(바이트 단위)가 포함됩니다. 자체).토스트하지 않습니다 나머지 표현을 제한합니다. 모든 C레벨 a를 지원하는 함수토스트-able 데이터 유형은 다음 사항에 주의해야 합니다. 핸들토스트ed 입력 값. (이것은 일반적으로 다음을 호출하여 수행됩니다.PG_DETOAST_DATUM어떤 일을 하기 전에 입력 값이지만 어떤 경우에는 더 효율적인 접근 방식이 있습니다. 가능합니다.)

토스트2비트를 빼앗음 varlena 길이 단어(빅엔디안의 상위 비트) 머신, 리틀 엔디안 머신의 하위 비트) a 값의 논리적 크기 제한토스트-가능 토토 사이트 유형을 1GB(230- 1바이트). 두 비트가 모두 0이면 값은 일반 값입니다. 유엔-토스트ed 토토 사이트 값 유형을 입력하고 길이 단어의 나머지 비트는 총계를 제공합니다. 데이텀 크기(길이 단어 포함)(바이트)입니다. 때 최상위 또는 최하위 비트가 설정된 경우 값에는 일반 4바이트 헤더 대신 단일 바이트 헤더 나머지 비트는 총 데이텀 크기(길이 포함)를 제공합니다. 바이트) 바이트 단위입니다. 특별한 경우로, 나머지 비트가 모두 0(자체 포함 길이에는 불가능함) 값은 별도의 TOAST에 저장된 라인 외부 토토 사이트에 대한 포인터입니다. 테이블. (TOAST 포인터의 크기는 두 번째 바이트에 제공됩니다. 데이텀.) 단일 바이트 헤더가 있는 값은 정렬되지 않습니다. 특정 경계도 마찬가지입니다. 마지막으로 최고 순위일 때 또는 최하위 비트가 지워졌지만 인접 비트가 설정되어 있는 경우 데이텀의 내용이 압축되었으므로 압축을 풀어야 합니다. 사용하기 전에. 이 경우 길이 단어의 나머지 비트 원본이 아닌 압축된 데이텀의 전체 크기를 제공합니다. 토토 사이트. 라인 외부 토토 사이트에 대해서도 압축이 가능합니다. 하지만 varlena 헤더는 그것이 발생했는지 여부를 알려주지 않습니다. 대신 TOAST 포인터의 내용이 이를 알려줍니다.

테이블의 열 중 하나가 다음과 같은 경우토스트-가능, 테이블에는 연관된 항목이 있습니다토스트OID가 다음과 같은 테이블 테이블에 저장됨pg_class.reltoastrelid항목. 오프라인토스트ed 값은 다음에 보관됩니다.토스트테이블에 설명된 대로 자세한 내용은 아래에서 확인하세요.

사용된 압축 기술은 매우 간단하고 매우 LZ 압축 기술 제품군의 빠른 구성원입니다. 참조src/backend/utils/adt/pg_lzcompress.c자세한 내용은.

라인 외부 값이 분할됩니다(사용된 경우 압축 후). 최대의 덩어리로TOAST_MAX_CHUNK_SIZE바이트(기본적으로 이 값 4개의 청크 행이 페이지에 맞도록 선택되어 약 2000바이트). 각 청크는에 별도의 행으로 저장됩니다.토스트소유용 테이블 테이블. 매토스트테이블에는 열chunk_id(OID 특정을 식별토스트ed 값),chunk_seq(청크의 시퀀스 번호 해당 값 내에서) 및chunk_data(청크의 실제 데이터). 에 대한 고유 인덱스chunk_id그리고chunk_seq빠른 검색 제공 가치. 라인 아웃을 나타내는 포인터 데이텀토스트14698_14751토스트찾을 테이블과 특정 값의 OID(해당chunk_id). 편의상 포인터 데이텀은 논리적 데이텀 크기(원본 비압축)도 저장합니다. 데이터 길이) 및 실제 저장된 크기(압축이 적용된 경우 다름) 적용됨). varlena 헤더 바이트를 허용하면 총 크기 의토스트포인터 데이텀은 다음과 같습니다. 따라서 실제 크기에 관계없이 18바이트입니다. 표현된 값입니다.

토스트코드가 트리거되었습니다 테이블에 저장될 행 값이 다음보다 넓은 경우에만TOAST_TUPLE_THRESHOLD바이트(일반적으로 2 KB).토스트코드는 행 값이 나올 때까지 필드 값을 줄 밖으로 압축 및/또는 이동합니다. 다음보다 짧습니다.TOAST_TUPLE_TARGET바이트 (일반적으로 2kB) 또는 더 이상 이득을 얻을 수 없습니다. 동안 UPDATE 작업, 변경되지 않은 필드의 값은 일반적으로 있는 그대로 보존됨; 따라서 행을 벗어난 값이 있는 행의 업데이트 발생하지 않음토스트없을 경우 비용 라인 밖의 값이 변경됩니다.

토스트코드가 인식합니다 저장을 위한 네 가지 다른 전략토스트-가능 열:

  • 일반압축을 방지합니다. 또는 오프라인 저장; 게다가 그것은 사용을 비활성화합니다 varlena 유형의 단일 바이트 헤더. 이것은 유일한 비 열에 대해 가능한 전략토스트-가능 토토 사이트 유형.

  • 확장두 가지 압축을 모두 허용합니다. 그리고 오프라인 저장. 이것이 대부분의 기본값입니다.토스트-가능 토토 사이트 유형. 먼저 압축을 시도한 다음 라인 외부 저장을 시도합니다. 행이 여전히 너무 큰 경우.

  • 외부라인 외부 허용 저장은 되지만 압축은 안 됩니다. 의 사용외부다음에 하위 문자열 작업을 수행합니다. 넓은텍스트바이테아열이 더 빨라집니다(단, 증가된 페널티 있음). 저장 공간) 이러한 작업은 다음에 최적화되어 있기 때문입니다. 다음과 같은 경우 라인 외부 값의 필수 부분만 가져옵니다. 압축되지 않았습니다.

  • 메인압축은 허용하지만 압축은 허용하지 않음 오프라인 저장. (실제로 오프라인 스토리지는 그러한 열에 대해서는 여전히 수행되지만 마지막으로만 수행됩니다. 행을 작게 만드는 다른 방법이 없을 때 리조트를 이용하세요. 충분합니다.)

각각토스트-able 데이터 유형 해당 데이터 유형의 열에 대한 기본 전략을 지정하지만 주어진 테이블 열에 대한 전략은 다음을 사용하여 변경할 수 있습니다.테이블 세트 저장소 변경.

이 계획은 다른 계획에 비해 많은 장점이 있습니다. 행 값의 범위를 허용하는 등의 간단한 접근 방식 페이지. 쿼리는 일반적으로 비교를 통해 한정된다고 가정합니다. 상대적으로 작은 키 값에 대해 대부분의 작업은 실행자는 기본 행 항목을 사용하여 수행됩니다. 의 큰 가치토스트ed 속성은 결과 집합이 선택될 때 꺼내집니다(선택한 경우). 클라이언트에게 전송됩니다. 따라서 메인 테이블은 훨씬 더 작고 더 많습니다. 해당 행 중 일부가 실제보다 공유 버퍼 캐시에 맞습니다. 오프라인 저장 없이. 정렬 세트도 축소되고 정렬됩니다. 전체가 메모리에서 수행되는 경우가 더 많습니다. 약간의 테스트 결과 일반적인 HTML 페이지와 해당 URL이 포함된 테이블은 포함된 원시 데이터 크기의 약 절반에 저장됩니다.토스트테이블이 있고 그 메인은 테이블에는 전체 데이터의 약 10%만 포함되어 있습니다(URL 및 일부 작은 HTML 페이지). 비교했을 때 실행 시간 차이가 없었습니다. un-에게토스트에드 비교 모든 HTML 페이지가 7kB로 축소된 표 맞다.