이 문서는 지원되지 않는 버전의 토토을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 65.2. 토범퍼카 토토버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

56.2. 토스트

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

토토고정 페이지를 사용합니다 크기 (일반적으로 8 kb), 튜플이 다중에 걸쳐 있지 않도록합니다. 페이지. 따라서 매우 큰 필드를 저장할 수 없습니다. 직접 가치. 이 제한을 극복하기 위해 큰 필드 값 압축 및/또는 여러 물리적 행으로 나뉩니다. 이것 대부분의 영향을 미치면 사용자에게 투명하게 발생합니다. 백엔드 코드의. 이 기술은 애정 적으로로 알려져 있습니다.토스트(또는"얇게 썬 빵 이후 가장 좋은 것").

특정 데이터 유형 만 지원토스트- 부과 할 필요가 없습니다 큰 필드 값을 생성 할 수없는 데이터 유형의 오버 헤드. 에게 지원하다토스트, 데이터 유형 가변 길이가 있어야합니다 (Varlena) 표현, 저장된 첫 32 비트 단어 값은 바이트의 값의 총 길이를 포함합니다 ( 그 자체).토스트그렇지 않습니다 나머지 표현을 제한합니다. 모든 C 수준 A 지원 기능토스트-가능한 데이터 유형은 조심해야합니다 핸들토스트입력 값. (이것은 일반적으로 호출하여 수행됩니다pg_detoast_datum입력 값이지만 경우에 따라 더 효율적인 접근 방식은 가능한.)

토스트두 비트의 비트 Varlena 길이 단어 (Big-Endian의 고차 비트 그로 인해 머신, 작은 엔디 언 기계의 저차 비트) A의 모든 값의 논리적 크기 제한토스트-가능한 데이터 유형에서 1GB (230-1 바이트). 두 비트가 모두 0이면 값은 평범합니다. un-토스트ED 데이터 값 유형 및 길이 단어의 나머지 비트는 전체를 제공합니다. 바이트의 데이텀 크기 (길이 단어 포함). 언제 가장 높은 주문 또는 가장 낮은 주문 비트가 설정되며 값은 일반 4 바이트 헤더 대신 단일 바이트 헤더 및 나머지 비트는 총 기준 크기를 제공합니다 (길이 포함 바이트) 바이트. 특별한 경우, 나머지 비트가 전부라면 0 (자기 포함 길이에 불가능할 것), 값은 별도의 토스트에 저장된 외부 데이터에 대한 포인터입니다. 테이블. (토스트 포인터의 크기는 두 번째 바이트에 나와 있습니다. Datum.) 단일 바이트 헤더가있는 값은 정렬되지 않습니다. 특정 경계. 마지막으로, 가장 높은 순위 또는 가장 낮은 비트 비트는 명확하지만 인접한 비트가 설정되어 있습니다. 데이텀의 내용은 압축되었으며 압축을 압축해야합니다. 사용하기 전에. 이 경우 길이 단어의 나머지 비트 원본이 아닌 압축 데이텀의 총 크기를 제공하십시오. 데이터. 외부 데이터에는 압축이 가능합니다 그러나 Varlena 헤더는 그것이 발생했는지 여부를 알려주지 않습니다. 토스트 포인터의 내용은 대신 그 말을합니다.

테이블 열의 열이토스트-가능, 테이블에는 관련이 있습니다토스트테이블 테이블에 저장pg_class.reltoastrelid입력. 외부토스트ed 값은에 보관됩니다.토스트테이블에 설명 된대로 아래의 자세한 내용.

사용 된 압축 기술은 상당히 간단하고 매우 LZ 제품군 압축 기술의 빠른 구성원. 보다src/backend/utils/adt/pg_lzcompress.c세부 사항은

외부 값이 나뉘어져 있습니다 (사용시 압축 후) 최대의 덩어리로TOAST_MAX_CHUNK_SIZE바이트 (기본적 으로이 값 4 개의 청크 행이 페이지에 맞도록 선택하여 약 2000 바이트). 각 청크는에 별도의 행으로 저장됩니다.토스트소유를위한 테이블 테이블. 모든토스트테이블이 있습니다 열chunk_id(OID 특정 식별토스트ed value),chunk_seq(청크의 시퀀스 번호 그 가치 내에서) 및chunk_data(청크의 실제 데이터). 독특한 색인chunk_idchunk_seq값. 외부를 나타내는 포인터 데이텀토스트ED 값은 필요합니다 의 OID를 저장하려면토스트표현할 테이블과 특정 값의 OID (ITSchunk_id). 편의를 위해 포인터 데이텀은 또한 논리적 기준 크기를 저장합니다 (원래 원래 압축되지 않은 원래 데이터 길이) 및 실제 저장된 크기 (압축이 다른 경우 다른 경우 적용된). Varlena 헤더 바이트, 총 크기를 허용합니다 A토스트포인터 기준입니다 따라서 실제 크기에 관계없이 18 바이트 대표 가치.

the토스트코드가 트리거됩니다 테이블에 저장 될 행 값이보다 넓은 경우에만TOAST_TUPLE_THRESHOLD바이트 (일반적으로 2 KB). 그만큼토스트코드는 행 값이 될 때까지 필드 값을 압축 및/또는 이동하십시오. 보다 짧습니다.TOAST_TUPLE_TARGET바이트 (일반적으로 2 kb) 또는 더 이상 이익을 얻을 수 없습니다. 동안 업데이트 작업, 변경되지 않은 필드의 값은 일반적으로입니다 보존 된 as-is; 따라서 외부 값이있는 행의 업데이트 incurs no토스트없는 경우 비용 외부 가치 변경 중.

the토스트코드가 인식됩니다 저장을위한 4 가지 전략토스트-가능한 열 :

  • 일반압축을 방지합니다 또는 외부 스토리지; 또한 사용을 비활성화합니다 Varlena 유형을위한 단일 바이트 헤더. 이것은 유일한 것입니다 비의 열에 대한 가능한 전략토스트-가능한 데이터 유형.

  • 확장두 압축을 모두 허용합니다 그리고 외부 저장소. 이것은 대부분의 기본입니다토스트-가능한 데이터 유형. 압축은 먼저 시도한 다음 외부 저장을 시도합니다 줄이 아직 너무 크면.

  • 외부외부를 허용합니다 저장하지만 압축은 아닙니다. 사용외부하위 문자열 작업을 수행합니다 넓은텍스트andBYTEA열이 더 빠릅니다 (증가 된 페널티에서 저장 공간) 이러한 작업은 최적화 되었기 때문입니다 외부 값의 필요한 부분 만 가져올 때 압축되지 않습니다.

  • Main압축은 허용하지만 그렇지 않습니다 외부 저장소. (실제로, 외부 스토리지는 할 것입니다 여전히 그러한 열에 대해 수행되지만 마지막으로 만 수행됩니다. 줄을 작게 만들 수있는 다른 방법이 없을 때 리조트 페이지에 적합하기에 충분합니다.)

토스트-가능한 데이터 유형 해당 데이터 유형의 열에 대한 기본 전략을 지정하지만 주어진 테이블 열에 대한 전략은로 변경 될 수 있습니다.Alter Table Set Storage.

이 체계는 더 많은 것에 비해 많은 장점이 있습니다. 행 값이 범위에 걸리는 것과 같은 간단한 접근 방식 페이지. 쿼리가 일반적으로 비교에 의해 자격이 있다고 가정합니다 비교적 작은 주요 값에 대해 집행자는 메인 행 항목을 사용하여 수행됩니다. 의 큰 가치토스트Ed 속성은 전용입니다 결과 세트가 다음과 같은 시점에 (전혀 선택된 경우) 고객에게 보냈습니다. 따라서 메인 테이블은 훨씬 작고 더 많습니다 공유 버퍼 캐시에 적합한 행은 사실보다 외부 저장소없이. 정렬 세트는 수축을 줄이고 정렬합니다 더 자주 기억하면서 더 자주 수행됩니다. 약간의 테스트가 나타났습니다 일반적인 HTML 페이지와 해당 URL이 포함 된 테이블은 를 포함하여 원시 데이터 크기의 약 절반에 저장토스트테이블 및 그 메인 테이블에는 전체 데이터의 약 10% 만 포함되어 있습니다 (URL 및 일부 작은 HTML 페이지). 비교하여 실행 시간 차이가 없었습니다 un-토스트Ed 비교 모든 HTML 페이지가 7kb로 절단 된 테이블 맞다.