| 윈 토토 : 문서 : 9.4 : 윈 토토 | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.4 : 데이터베이스 토토 사이트 레이아웃 | PostgreSQL : 문서 : 9.4 : 토토 캔 물리적 스토리지 | 59장. 토토 커뮤니티베이스 물리적 저장소 | 롤 토토 : 문서 : 9.4 : 여유 공간지도 |
이 섹션은 다음에 대한 개요를 제공합니다.토스트(대규모 속성 저장 기술).
포스트그레SQL고정된 페이지 크기(일반적으로 8kB)를 사용하며 튜플이 여러 페이지에 걸쳐 있는 것을 허용하지 않습니다. 따라서 매우 큰 필드 값을 직접 저장할 수 없습니다. 이러한 제한을 극복하기 위해 큰 필드 값이 압축되거나 여러 물리적 행으로 분할됩니다. 이는 사용자에게 투명하게 발생하며 대부분의 백엔드 코드에는 약간의 영향만 미칩니다. 이 기술은 애칭으로 알려져 있습니다.토스트(또는"얇게 썬 빵 이후로 가장 좋은 것은").
특정 데이터 유형만 지원토스트— 큰 필드 값을 생성할 수 없는 데이터 유형에 오버헤드를 부과할 필요가 없습니다. 지원하다토스트, 토토 커뮤니티 유형은 가변 길이(발레나) 표현. 저장된 값의 첫 번째 32비트 워드에는 해당 값의 전체 길이(자체 포함)가 바이트 단위로 포함됩니다.토스트나머지 표현을 제한하지 않습니다. a를 지원하는 모든 C 수준 함수토스트-able 토토 커뮤니티 유형은 주의해서 처리해야 합니다.토스트ed 입력 값입니다. (이것은 일반적으로 다음을 호출하여 수행됩니다.PG_DETOAST_DATUM입력 값으로 작업을 수행하기 전이지만 어떤 경우에는 더 효율적인 접근 방식이 가능합니다.)
토스트varlena 길이 단어의 2비트(빅엔디안 시스템의 상위 비트, 리틀엔디안 시스템의 하위 비트)를 빼앗아 a의 모든 값의 논리적 크기를 제한합니다.토스트-가능 토토 커뮤니티 유형을 1GB(230- 1바이트). 두 비트가 모두 0이면 값은 일반 un-입니다.토스트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값의 빠른 검색을 제공합니다. 라인 아웃을 나타내는 포인터 데이텀토스트14314_14365토스트찾을 테이블과 특정 값의 OID(해당chunk_id). 편의를 위해 포인터 데이텀은 논리적 데이텀 크기(압축되지 않은 원래 데이터 길이)와 실제 저장된 크기(압축이 적용된 경우 다름)도 저장합니다. varlena 헤더 바이트를 허용하면 a의 전체 크기토스트포인터 데이텀은 표시된 값의 실제 크기에 관계없이 18바이트입니다.
그토스트코드는 테이블에 저장될 행 값이 다음보다 넓은 경우에만 트리거됩니다.TOAST_TUPLE_THRESHOLD바이트(일반적으로 2kB). 그만큼토스트코드는 행 값이 다음보다 짧아질 때까지 필드 값을 줄 밖으로 압축 및/또는 이동합니다.TOAST_TUPLE_TARGET바이트(일반적으로 2kB) 또는 더 이상 이득을 얻을 수 없습니다. UPDATE 작업 중에 변경되지 않은 필드의 값은 일반적으로 있는 그대로 유지됩니다. 따라서 행을 벗어난 값이 있는 행의 업데이트는 발생하지 않습니다.토스트라인 외부 값이 변경되지 않는 경우 비용.
그토스트코드는 네 가지 저장 전략을 인식합니다.토스트-가능 열:
일반압축 또는 라인 외부 저장을 방지합니다. 또한 varlena 유형에 대한 단일 바이트 헤더 사용을 비활성화합니다. 이는 비 열에 대해 가능한 유일한 전략입니다.토스트-가능 토토 커뮤니티 유형.
확장됨압축과 라인 외부 저장을 모두 허용합니다. 이것이 대부분의 기본값입니다.토스트-가능 토토 커뮤니티 유형. 먼저 압축을 시도한 다음 행이 여전히 너무 크면 라인 외부 저장을 시도합니다.
외부out-of-line 저장은 허용하지만 압축은 허용하지 않습니다. 의 사용외부와이드에서 하위 문자열 작업을 수행합니다텍스트그리고바이테아열이 더 빨라집니다(저장 공간이 늘어나지만). 이러한 작업은 압축되지 않은 경우 라인 외부 값의 필수 부분만 가져오도록 최적화되어 있기 때문입니다.
메인압축은 허용하지만 라인 외부 저장은 허용하지 않습니다. (실제로 이러한 열에 대해 라인 외부 저장이 계속 수행되지만 행을 페이지에 맞도록 작게 만들 수 있는 다른 방법이 없는 경우 최후의 수단으로만 수행됩니다.)
각각토스트-able 데이터 유형은 해당 데이터 유형의 열에 대한 기본 전략을 지정하지만 지정된 테이블 열에 대한 전략은 다음을 사용하여 변경할 수 있습니다.테이블 세트 저장소 변경.
이 구성표는 행 값을 페이지에 걸쳐 허용하는 것과 같은 보다 간단한 접근 방식에 비해 여러 가지 장점이 있습니다. 일반적으로 쿼리가 상대적으로 작은 키 값과의 비교를 통해 한정된다고 가정하면 실행 프로그램의 작업 대부분은 기본 행 항목을 사용하여 수행됩니다. 의 큰 가치토스트ed 속성은 결과 세트가 클라이언트로 전송될 때만 추출됩니다(선택한 경우). 따라서 기본 테이블은 라인 외부 저장소가 없는 경우보다 훨씬 더 작고 공유 버퍼 캐시에 맞는 행이 더 많습니다. 정렬 세트도 축소되고 정렬은 전체 메모리에서 수행되는 경우가 더 많습니다. 약간의 테스트를 통해 일반적인 HTML 페이지와 해당 URL이 포함된 테이블이 다음을 포함한 원시 데이터 크기의 약 절반에 저장되어 있음을 보여주었습니다.토스트테이블, 그리고 기본 테이블에는 전체 데이터(URL 및 일부 작은 HTML 페이지)의 약 10%만 포함되어 있습니다. un-와 비교하여 실행 시간 차이가 없었습니다.토스트ed 비교표에는 모든 HTML 페이지가 적합하도록 7kB로 잘렸습니다.
| 이전 | 윈 토토 : 문서 : 9.4 : 윈 토토 9.4.26 문서화 | 롤 토토 : 문서 : 9.4 : 여유 공간지도 |
| 토토 커뮤니티베이스 파일 레이아웃 | PostgreSQL : 문서 : 9.4 : 토토 캔 물리적 스토리지 | 자유 공간 지도 |