Reindex - 인덱스 재건
reindex [(Verbose)] index | 표 | 스키마 | 데이터베이스 | System [동시에]이름
reindex
스포츠 토토 베트맨 테이블에 저장된 데이터를 사용하여 스포츠 토토 베트맨를 다시 작성하여 색인의 기존 사본을 대체합니다. 사용할 몇 가지 시나리오가 있습니다Reindex
:
스포츠 토토 베트맨가 손상되었으며 더 이상 유효한 데이터를 포함하지 않습니다. 이론적으로는 이런 일이 일어나지 않아야하지만 실제로는 소프트웨어 버그 나 하드웨어 고장으로 인해 스포츠 토토 베트맨가 손상 될 수 있습니다.Reindex
복구 방법을 제공합니다.
스포츠 토토 베트맨가되었습니다“Bloated”, 그것은 비어 있거나 거의 비어있는 많은 페이지를 포함합니다. 이것은 b- 트리 색인에서에서 발생할 수 있습니다.PostgreSQL특정 드문 액세스 패턴 아래.Reindex
죽은 페이지없이 스포츠 토토 베트맨의 새 버전을 작성하여 스포츠 토토 베트맨의 공간 소비를 줄이는 방법을 제공합니다. 보다토토 핫 : 문서 : 12 : 24.2. 일상적인 구매자세한 내용은
당신은 색인에 대한 스토리지 매개 변수 (예 : Fillfactor)를 변경했으며 변경이 완전한 효과를 보장하고자합니다.
스포츠 토토 베트맨 빌드가에 실패한 경우동시에
옵션,이 색인은로 남겨 둡니다.“Invalid”. 이러한 스포츠 토토 베트맨는 쓸모가 없지만 사용하기 편리 할 수 있습니다Reindex
재건하려면. 만Reindex Index
유효하지 않은 스포츠 토토 베트맨에서 동시 빌드를 수행 할 수 있습니다.
색인
지정된 스포츠 토토 베트맨 재현.
테이블
지정된 테이블의 모든 인덱스를 재현합니다. 테이블에 보조가있는 경우“토스트”테이블, 그것은 또한 다시 표시됩니다.
스키마
지정된 스키마의 모든 색인을 재현합니다. 이 스키마의 테이블에 보조가있는 경우“토스트”테이블, 그것은 또한 다시 표시됩니다. 공유 시스템 카탈로그의 색인도 처리됩니다. 이 형태의Reindex
트랜잭션 블록 내부에서 실행할 수 없습니다.
데이터베이스
현재 데이터베이스 내의 모든 인덱스를 재현합니다. 공유 시스템 카탈로그의 색인도 처리됩니다. 이 형태의Reindex
트랜잭션 블록 내부에서 실행할 수 없습니다.
System
현재 데이터베이스 내 시스템 카탈로그에서 모든 색인을 재현합니다. 공유 시스템 카탈로그의 인덱스가 포함되어 있습니다. 사용자 테이블의 인덱스는 처리되지 않습니다. 이 형태의Reindex
트랜잭션 블록 내부에서 실행할 수 없습니다.
이름
특정 색인, 테이블 또는 데이터베이스의 이름은 다시 표시됩니다. 인덱스 및 테이블 이름은 스키마 자격을 사용할 수 있습니다. 현재,Reindex 데이터베이스
andReindex System
현재 데이터베이스 만 다시 표시 할 수 있으므로 매개 변수는 현재 데이터베이스 이름과 일치해야합니다.
동시에
이 옵션이 사용될 때postgresql테이블에서 동시 인서트, 업데이트 또는 삭제를 방지하는 잠금 장치를 가져 가지 않고 인덱스를 재구성합니다. 표준 인덱스는 잠금을 재건 해제 할 때까지 테이블에 쓴 (읽지 않음)를 재건합니다. 이 옵션을 사용할 때 알아야 할 몇 가지 경고가 있습니다. 참조지수 재건 동시에.
임시 테이블의 경우reindex
다른 세션에 액세스 할 수없고, 비 콘유트 리스포츠 토토 베트맨는 저렴합니다..
Verbose
각 지수가 다시 표시 될 때 진행 보고서를 인쇄합니다.
사용자 테이블에서 인덱스의 손상이 의심되는 경우 사용하여 해당 인덱스 또는 테이블의 모든 색인을 재 구축 할 수 있습니다Reindex Index
또는Reindex 테이블
.
시스템 테이블에서 인덱스의 손상을 복구 해야하는 경우 문제가 더 어렵습니다. 이 경우 시스템이 용의자 지수 자체를 사용하지 않은 것이 중요합니다. (실제로 이러한 종류의 시나리오에서는 손상된 인덱스에 대한 의존으로 인해 서버 프로세스가 시작시 즉시 충돌하고 있음을 알 수 있습니다.) 안전하게 복구하려면 서버는로 시작해야합니다.-p
옵션, 시스템 카탈로그 조회에 스포츠 토토 베트맨를 사용하지 못하게합니다.
이를 수행하는 한 가지 방법은 서버를 종료하고 단일 사용자를 시작하는 것입니다PostgreSQL서버가있는-p
명령 줄에 포함 된 옵션. 그 다음에,Reindex 데이터베이스
, Reindex System
, Reindex 테이블
또는Reindex Index
재구성하려는 양에 따라 발행 할 수 있습니다. 의심스러운 경우 사용Reindex System
데이터베이스에서 모든 시스템 인덱스의 재구성을 선택합니다. 그런 다음 단일 사용자 서버 세션을 종료하고 일반 서버를 다시 시작하십시오. 참조Postgres단일 사용자 서버 인터페이스와 상호 작용하는 방법에 대한 자세한 내용은 참조 페이지
또는 일반 서버 세션을 시작할 수 있습니다.-p
명령 줄 옵션에 포함됩니다. 이를 수행하는 방법은 고객마다 다르지만 모두libpq기반 클라이언트,를 설정할 수 있습니다pgoptions
환경 변수 to-p
클라이언트를 시작하기 전에. 이 방법은 다른 클라이언트를 잠그는 것이 필요하지 않지만 수리가 완료 될 때까지 다른 사용자가 손상된 데이터베이스에 연결하는 것을 방지하는 것이 여전히 현명 할 수 있습니다..
Reindex
는 스포츠 토토 베트맨 내용이 처음부터 재건된다는 점에서 스포츠 토토 베트맨의 드롭 및 재생성과 유사합니다. 그러나 잠금 고려 사항은 다소 다릅니다.Reindex
Locks Out은 쓰기를 읽지 만 인덱스의 상위 테이블을 읽지 않습니다. 또한도 필요합니다.액세스 독점
처리중인 특정 스포츠 토토 베트맨를 잠그고 해당 스포츠 토토 베트맨를 사용하려는 읽기를 차단합니다. 대조적으로,Drop Index
순간적으로액세스 독점
부모 테이블을 잠그고 두 글과 읽기를 차단합니다. 후속색인 생성
Locks Out은 쓰기를 읽지 않지만 읽지 않습니다. 스포츠 토토 베트맨가 없으므로 읽기가 사용하려고 시도하지 않으므로 차단이 없지만 읽기가 값 비싼 순차적 스캔으로 강제 될 수 있음을 의미합니다.
단일 색인 또는 테이블을 다시 표시하려면 해당 인덱스 또는 테이블의 소유자가 필요합니다. 스키마 또는 데이터베이스를 다시 표시하려면 해당 스키마 또는 데이터베이스의 소유자가 필요합니다. 따라서 비 슈퍼 사용자가 다른 사용자가 소유 한 테이블의 인덱스를 재건 할 수 있습니다. 그러나 특별한 예외로Reindex 데이터베이스
, Reindex Schema
또는Reindex System
는 비 슈퍼 루저에서 발행되며, 공유 카탈로그의 색인은 사용자가 카탈로그를 소유하지 않으면 건너 뜁니다 (일반적으로 그렇지 않음). 물론 슈퍼 사용자는 항상 모든 것을 다시 구사할 수 있습니다.
Reindexing 파티션 테이블 또는 분할 된 인덱스는 지원되지 않습니다. 각 개별 파티션은 대신 별도로 구사 될 수 있습니다.
인덱스 재건은 데이터베이스의 정기적 인 작동을 방해 할 수 있습니다. 보통postgresql인덱스가 쓰기에 대해 재건 된 테이블을 잠그고 테이블의 단일 스캔으로 전체 색인 빌드를 수행합니다. 다른 트랜잭션은 여전히 테이블을 읽을 수 있지만 테이블에 행을 삽입, 업데이트 또는 삭제하려고하면 인덱스 재건이 완료 될 때까지 차단됩니다. 시스템이 라이브 프로덕션 데이터베이스 인 경우 심각한 영향을 줄 수 있습니다. 매우 큰 테이블을 색인화하는 데 많은 시간이 걸릴 수 있으며, 작은 테이블의 경우, 인덱스 재건은 제작 시스템에 허용 할 수없는 기간 동안 작가를 잠글 수 있습니다.
PostgreSQL쓰기의 최소 잠금으로 재건축 인덱스를 지원합니다. 이 방법은를 지정하여 호출됩니다.동시에
옵션Reindex
. 이 옵션이 사용될 때PostgreSQL각 지수에 대해 테이블의 두 스캔을 수행해야하며, 이는 재건되어야하며 인덱스를 사용할 수있는 모든 기존 트랜잭션의 종료를 기다려야합니다. 이 방법은 표준 지수 재건보다 더 많은 총 작업이 필요하며 인덱스를 수정할 수있는 미완성 트랜잭션을 기다려야하므로 완료하는 데 훨씬 더 오래 걸립니다. 그러나 인덱스가 재건되는 동안 일반 작업이 계속 될 수 있으므로이 방법은 생산 환경에서 인덱스를 재건하는 데 유용합니다. 물론, 인덱스 재건으로 부과 된 추가 CPU, 메모리 및 I/O 부하는 다른 작업 속도를 늦출 수 있습니다.
다음 단계는 동시 리인덱스에서 발생합니다. 각 단계는 별도의 거래에서 실행됩니다. 재건 할 인덱스가 여러 개있는 경우 각 단계는 다음 단계로 이동하기 전에 모든 인덱스를 반복합니다.
카탈로그에 새로운 과도 지수 정의가 추가됩니다pg_index
. 이 정의는 이전 색인을 대체하는 데 사용됩니다. 에이공유 업데이트 독점
처리 중에 스키마 수정을 방지하기 위해 관련 테이블뿐만 아니라 다시 표시되는 인덱스에서 세션 수준에서 잠금이 발생합니다.
스포츠 토토 베트맨를 구축하는 첫 번째 패스는 각각의 새로운 스포츠 토토 베트맨마다 수행됩니다. 스포츠 토토 베트맨가 구축되면 플래그PG_INDEX.INDISREADY
로 전환“true”삽입 준비를 준비하려면 빌드를 수행 한 트랜잭션이 완료되면 다른 세션에 보이도록합니다. 이 단계는 각 지수에 대해 별도의 트랜잭션에서 수행됩니다.
그런 다음 첫 번째 패스가 작동하는 동안 추가 된 튜플을 추가하기 위해 두 번째 패스가 수행됩니다. 이 단계는 각 지수에 대해 별도의 트랜잭션에서도 수행됩니다.
인덱스를 참조하는 모든 제약 조건은 새 인덱스 정의를 참조하도록 변경되고 인덱스 이름이 변경됩니다. 이 시점에서pg_index.indisvalid
로 전환“True”새로운 색인 및 to“거짓”기존의 경우, 캐시 무효화가 수행되어 기존 색인을 무효화하는 모든 세션이 발생합니다.
이전 인덱스는PG_INDEX.INDISREADY
전환“거짓”새로운 튜플 삽입을 방지하려면 이전 색인을 참조 할 수있는 실행 쿼리를 기다린 후.
이전 인덱스가 삭제됩니다. 그만큼공유 업데이트 독점
인덱스 및 테이블에 대한 세션 잠금 장치가 해제됩니다.
고유 한 지수의 독창성 위반과 같은 지수를 재건하는 동안 문제가 발생하면Reindex
명령은 실패하지만 뒤에 남겨 둡니다.“Invalid”새로운 인덱스 외에 기존 인덱스. 이 색인은 불완전 할 수 있으므로 쿼리 목적으로 무시됩니다. 그러나 여전히 업데이트 오버 헤드를 소비합니다. 그만큼PSQL \ d
명령은와 같은 색인을보고합니다.Invalid
:
postgres =# \ d 탭 "public.tab"테이블 열 | 유형 | 수정 자 --------+--------+----------- col | 정수 | 인덱스 : "idx"btree (col) "idx_ccnew"btree (col) invalid
스포츠 토토 베트맨가 표시된 경우Invalid
접미사ccnew
, 그런 다음 동시 작업 중에 생성 된 과도 지수에 해당하며 권장되는 복구 방법은를 사용하여 삭제하는 것입니다.Drop Index
, 그런 다음 시도Reindex 동시에
다시. 유효하지 않은 인덱스가 대신 접미사 인 경우ccold
, 삭제할 수없는 원래 색인에 해당합니다. 권장 복구 방법은 재건축이 성공적 이었으므로 상기 색인을 삭제하는 것입니다.
일반 인덱스 빌드는 동일한 테이블의 다른 일반 색인 빌드가 동시에 발생할 수 있도록 허용하지만 한 번에 테이블에서 하나의 동시 인덱스 빌드 만 발생할 수 있습니다. 두 경우 모두 테이블의 다른 유형의 스키마 수정은 허용되지 않습니다. 또 다른 차이점은 정기적 인 것입니다Reindex 테이블
또는Reindex Index
명령은 트랜잭션 블록 내에서 수행 할 수 있지만Reindex 동시에
할 수 없습니다.
장기 실행 거래와 마찬가지로Reindex
테이블에서 동시에 제거 할 수있는 튜플에 영향을 줄 수 있습니다진공
다른 테이블에서.
Reindex System
지원하지 않음동시에
시스템 카탈로그는 동시에 다시 표시 할 수 없으므로
또한 배제 제약에 대한 인덱스는 동시에 다시 표시 될 수 없습니다. 이 인덱스 가이 명령에서 직접 명명되면 오류가 발생합니다. 제외 구속인 인덱스가있는 테이블 또는 데이터베이스가 동시에 다시 표시되면 해당 인덱스가 건너 뜁니다. (없이 그러한 색인을 다시 알게 될 수 있습니다동시에
옵션.)
단일 색인 재건 :
Reindex index my_index;
테이블의 모든 인덱스를 재구성my_table
:
Reindex 테이블 my_table;
시스템 인덱스가 이미 유효하도록 신뢰하지 않고 특정 데이터베이스의 모든 색인을 재구성합니다.
$export pgoptions = "-p"
$PSQL Broken_DB
... broken_db = reindex 데이터베이스 broken_db; broken_db = \ q
Reindexing이 진행중인 동안 관련 관계에 대한 읽기 및 쓰기 작업을 차단하지 않고 테이블의 인덱스 재건축 :
Reindex 테이블 동시에 my_broken_table;
없음Reindex
SQL 표준의 명령.