REINDEX

REINDEX — 색인 재구축

시놉시스

REINDEX [ (옵션[, ...] ) ]  토토 | 표 | 스키마 | 데이터베이스 | 시스템  ​​[ 동시 ]이름

어디에서옵션다음 중 하나일 수 있습니다.동시적으로 [부울]
    테이블스페이스new_tablespace자세한 내용 [부울 ]

설명

REINDEX인덱스 테이블에 저장된 데이터를 사용하여 인덱스를 다시 작성하고 인덱스의 이전 복사본을 대체합니다. 사용할 수 있는 몇 가지 시나리오가 있습니다.REINDEX:

  • 색인이 손상되었으며 더 이상 유효한 데이터를 포함하지 않습니다. 이론적으로는 절대 이런 일이 발생해서는 안 되지만 실제로는 소프트웨어 버그나 하드웨어 오류로 인해 토토가 손상될 수 있습니다.REINDEX복구 방법을 제공합니다.

  • 색인이 되었습니다부풀어오르다, 즉 비어 있거나 거의 비어 있는 페이지가 많이 포함되어 있습니다. 이는 B-트리 토토에서 발생할 수 있습니다.포스트그레SQL일반적이지 않은 특정 액세스 패턴에 따라.REINDEX은 데드 페이지 없이 토토의 새 버전을 작성하여 토토의 공간 소비를 줄이는 방법을 제공합니다. 보다스포츠 토토 결과 : 문서 : 14 : 25.2. 일상적인 구매더 많은 정보를 원하시면.

  • 토토에 대한 저장 매개변수(예: 채우기 요소)를 변경했으며 변경 사항이 완전히 적용되기를 원합니다.

  • 색인 빌드가 실패할 경우동시옵션, 이 색인은 다음과 같이 남습니다.잘못됨. 이러한 토토는 쓸모가 없지만 사용하기 편리할 수 있습니다.REINDEX재구축합니다. 참고하세요REINDEX 인덱스잘못된 인덱스에 대해 동시 빌드를 수행할 수 있습니다.

매개변수

INDEX

지정된 색인을 다시 생성하십시오. 이 형태는REINDEX파티션된 토토와 함께 사용하는 경우 트랜잭션 블록 내에서 실행할 수 없습니다.

지정된 테이블의 모든 토토를 다시 생성합니다. 테이블에 보조 테이블이 있는 경우토스트테이블도 다시 색인화되었습니다. 이 형태는REINDEX파티션을 나눈 테이블과 함께 사용하는 경우 트랜잭션 블록 내에서 실행할 수 없습니다.

스키마

지정된 스키마의 모든 색인을 다시 생성하십시오. 이 스키마의 테이블에 보조 스키마가 있는 경우토스트테이블도 다시 색인화되었습니다. 공유 시스템 카탈로그의 토토도 처리됩니다. 이 형태는REINDEX트랜잭션 블록 내에서는 실행할 수 없습니다.

데이터베이스

현재 데이터베이스 내의 모든 색인을 다시 생성하십시오. 공유 시스템 카탈로그의 인덱스도 처리됩니다. 이 형태는REINDEX트랜잭션 블록 내에서는 실행할 수 없습니다.

시스템

현재 데이터베이스 내의 시스템 카탈로그에 대한 모든 색인을 다시 생성하십시오. 공유 시스템 카탈로그의 인덱스가 포함됩니다. 사용자 테이블의 인덱스는 처리되지 않습니다. 이 형태는REINDEX트랜잭션 블록 내에서는 실행할 수 없습니다.

이름

재인덱싱할 특정 인덱스, 테이블 또는 데이터베이스의 이름. 인덱스 및 테이블 이름은 스키마로 한정될 수 있습니다. 현재,REINDEX 데이터베이스그리고REINDEX 시스템현재 데이터베이스만 다시 색인화할 수 있으므로 해당 매개변수는 현재 데이터베이스 이름과 일치해야 합니다.

동시

이 옵션을 사용하면,PostgreSQL테이블에 대한 동시 삽입, 업데이트 또는 삭제를 방지하는 잠금을 사용하지 않고 인덱스를 다시 작성합니다. 반면 표준 인덱스 재구축은 완료될 때까지 테이블에 대한 쓰기(읽기는 제외)를 차단합니다. 이 옵션을 사용할 때 주의해야 할 몇 가지 주의 사항이 있습니다. — 참조동시에 색인 재구축아래.

임시 테이블의 경우,REINDEX다른 세션이 액세스할 수 없으므로 항상 비동시적이며 비동시 재색인이 더 저렴합니다.

테이블스페이스

색인이 새 테이블스페이스에 재구축되도록 지정합니다.

상세

각 색인이 다시 색인화될 때 진행 보고서를 인쇄합니다.

부울

선택한 옵션을 켜야 할지 꺼야 할지 지정합니다. 쓸 수 있습니다, 켜짐또는1옵션을 활성화하고거짓, 꺼짐또는0비활성화합니다. 그만큼부울값을 생략할 수도 있습니다. 이 경우가정됩니다.

new_tablespace

색인이 재구축될 테이블스페이스입니다.

참고

사용자 테이블의 인덱스 손상이 의심되는 경우 다음을 사용하여 해당 인덱스 또는 테이블의 모든 인덱스를 간단히 재구축할 수 있습니다.REINDEX 인덱스또는REINDEX 테이블.

시스템 테이블의 인덱스 손상을 복구해야 하는 경우 상황은 더욱 어렵습니다. 이 경우 시스템이 의심되는 인덱스 자체를 사용하지 않는 것이 중요합니다. (실제로 이런 종류의 시나리오에서는 손상된 인덱스에 대한 의존으로 인해 서버 프로세스가 시작 시 즉시 충돌하는 것을 확인할 수 있습니다.) 안전하게 복구하려면 서버를 다음으로 시작해야 합니다.-P옵션, 시스템 카탈로그 조회에 색인을 사용하지 못하게 하는 옵션입니다.

이를 수행하는 한 가지 방법은 서버를 종료하고 단일 사용자를 시작하는 것입니다.PostgreSQL서버가-P옵션이 명령줄에 포함되어 있습니다. 그 다음에,REINDEX 데이터베이스, 리인덱스 시스템, REINDEX 테이블, 또는REINDEX 인덱스재구축하려는 정도에 따라 발행될 수 있습니다. 의심스러운 경우 다음을 사용하세요.REINDEX 시스템데이터베이스의 모든 시스템 색인 재구성을 선택합니다. 그런 다음 단일 사용자 서버 세션을 종료하고 일반 서버를 다시 시작합니다. 참조포스트그레단일 사용자 서버 인터페이스와 상호작용하는 방법에 대한 자세한 내용은 참조 페이지입니다.

또는 일반 서버 세션을 다음으로 시작할 수 있습니다.-P명령줄 옵션에 포함되어 있습니다. 이를 수행하는 방법은 클라이언트마다 다르지만 모두libpq기반 클라이언트에서는 다음을 설정할 수 있습니다.PGOPTIONS환경 변수를-P클라이언트를 시작하기 전에. 이 방법에서는 다른 클라이언트를 잠글 필요가 없지만 복구가 완료될 때까지 다른 사용자가 손상된 데이터베이스에 연결하지 못하도록 하는 것이 현명할 수 있습니다.

REINDEX토토 콘텐츠가 처음부터 다시 작성된다는 점에서 토토 삭제 및 재생성과 유사합니다. 그러나 잠금 고려 사항은 다소 다릅니다.REINDEX토토의 상위 테이블에 대한 쓰기는 차단하지만 읽기는 차단하지 않습니다. 또한 시간이 걸립니다.접속 독점처리 중인 특정 토토를 잠그면 해당 토토를 사용하려는 읽기가 차단됩니다. 대조적으로,드롭 토토잠시 동안접속 독점상위 테이블을 잠그고 쓰기와 읽기를 모두 차단합니다. 후속색인 생성쓰기는 잠그지만 읽기는 잠그지 않습니다. 토토가 없기 때문에 어떤 읽기도 이를 사용하려고 시도하지 않습니다. 즉, 차단은 없지만 읽기는 비용이 많이 드는 순차 스캔으로 강제 실행될 수 있습니다.

단일 색인이나 테이블을 다시 색인화하려면 해당 색인이나 테이블의 소유자여야 합니다. 스키마 또는 데이터베이스를 다시 색인화하려면 해당 스키마 또는 데이터베이스의 소유자여야 합니다. 특히 슈퍼유저가 아닌 사람도 다른 사용자가 소유한 테이블의 인덱스를 다시 작성할 수 있다는 점에 유의하세요. 다만, 특별한 예외가 있는 경우에는REINDEX 데이터베이스, REINDEX 스키마또는REINDEX 시스템수퍼유저가 아닌 사람이 발행한 경우, 사용자가 카탈로그를 소유하지 않는 한 공유 카탈로그의 색인은 건너뜁니다(일반적으로 그렇지 않음). 물론 슈퍼유저는 언제든지 무엇이든 다시 색인화할 수 있습니다.

분할된 인덱스 또는 분할된 테이블의 재인덱싱은 다음에서 지원됩니다.REINDEX 인덱스또는REINDEX 테이블입니다. 지정된 분할 관계의 각 파티션은 별도의 트랜잭션에서 다시 인덱싱됩니다. 분할된 테이블이나 토토에서 작업할 때 트랜잭션 블록 내에서 이러한 명령을 사용할 수 없습니다.

사용 시테이블스페이스다음과 함께REINDEX파티션된 인덱스 또는 테이블에서는 리프 파티션의 테이블스페이스 참조만 업데이트됩니다. 분할된 인덱스는 업데이트되지 않으므로 별도로 사용하는 것이 좋습니다테이블만 변경연결된 새 파티션이 새 테이블스페이스를 상속하도록 합니다. 실패하면 모든 인덱스가 새 테이블스페이스로 이동되지 않았을 수 있습니다. 명령을 다시 실행하면 모든 리프 파티션이 재구축되고 이전에 처리되지 않은 인덱스가 새 테이블스페이스로 이동됩니다.

만약스키마, 데이터베이스또는시스템다음과 함께 사용됨테이블스페이스, 시스템 관계는 건너뛰고 단일경고생성됩니다. TOAST 테이블의 인덱스는 재구축되지만 새 테이블스페이스로 이동되지는 않습니다.

동시에 색인 재구축

인덱스를 재구축하면 데이터베이스의 일반 작동을 방해할 수 있습니다. 보통PostgreSQL쓰기에 대해 인덱스가 재구성된 테이블을 잠그고 테이블을 한 번 스캔하여 전체 인덱스 빌드를 수행합니다. 다른 트랜잭션은 여전히 ​​테이블을 읽을 수 있지만 테이블의 행을 삽입, 업데이트 또는 삭제하려고 하면 인덱스 재구축이 완료될 때까지 차단됩니다. 시스템이 라이브 프로덕션 데이터베이스인 경우 이는 심각한 영향을 미칠 수 있습니다. 매우 큰 테이블은 색인을 생성하는 데 많은 시간이 걸릴 수 있으며, 작은 테이블의 경우에도 색인 재구축으로 인해 프로덕션 시스템에서 허용할 수 없을 정도로 긴 기간 동안 작성자가 잠길 수 있습니다.

PostgreSQL최소 쓰기 잠금으로 색인 재구축을 지원합니다. 이 메소드는 다음을 지정하여 호출됩니다.동시옵션REINDEX. 이 옵션을 사용하면,PostgreSQL재구축해야 하는 각 토토에 대해 테이블을 두 번 스캔해야 하며 잠재적으로 토토를 사용할 수 있는 모든 기존 트랜잭션이 종료될 때까지 기다려야 합니다. 이 방법을 사용하려면 표준 토토 재구축보다 더 많은 총 작업이 필요하고 토토를 수정할 수 있는 완료되지 않은 트랜잭션을 기다려야 하므로 완료하는 데 훨씬 더 오랜 시간이 걸립니다. 그러나 토토를 재구축하는 동안 정상적인 작업을 계속할 수 있으므로 이 방법은 프로덕션 환경에서 토토를 재구축하는 데 유용합니다. 물론 토토 재구축으로 인한 추가 CPU, 메모리, I/O 로드로 인해 다른 작업 속도가 느려질 수 있습니다.

다음 단계는 동시 재색인에서 발생합니다. 각 단계는 별도의 트랜잭션에서 실행됩니다. 재구축할 인덱스가 여러 개인 경우 각 단계는 다음 단계로 이동하기 전에 모든 인덱스를 반복합니다.

  1. 새로운 임시 색인 정의가 카탈로그에 추가되었습니다.pg_index. 이 정의는 이전 인덱스를 대체하는 데 사용됩니다. 에이업데이트 독점 공유처리하는 동안 스키마 수정을 방지하기 위해 다시 색인화되는 색인과 관련 테이블에 대해 세션 수준 잠금이 수행됩니다.

  2. 색인을 구축하기 위한 첫 번째 단계는 각각의 새로운 색인에 대해 수행됩니다. 토토가 구축되면 해당 플래그pg_index.indisready다음으로 전환됨삽입 준비를 하고, 빌드를 수행한 트랜잭션이 완료된 후 다른 세션에 표시되도록 합니다. 이 단계는 각 토토에 대한 별도의 트랜잭션에서 수행됩니다.

  3. 그런 다음 첫 번째 패스가 실행되는 동안 추가된 튜플을 추가하기 위해 두 번째 패스가 수행됩니다. 이 단계는 각 인덱스에 대한 별도의 트랜잭션에서도 수행됩니다.

  4. 인덱스를 참조하는 모든 제약 조건은 새 인덱스 정의를 참조하도록 변경되며 인덱스 이름이 변경됩니다. 이 시점에서,pg_index.indisvalid다음으로 전환됨새 색인 및 대상거짓기존의 경우 캐시 무효화가 완료되어 이전 인덱스를 참조한 모든 세션이 무효화되었습니다.

  5. 이전 색인에는pg_index.indisready다음으로 전환됨거짓이전 색인을 참조할 수 있는 쿼리 실행이 완료될 때까지 기다린 후 새로운 튜플 삽입을 방지합니다.

  6. 이전 색인은 삭제되었습니다. 그만큼업데이트 독점 공유토토와 테이블에 대한 세션 잠금이 해제됩니다.

고유 토토의 고유성 위반과 같이 토토를 재구축하는 동안 문제가 발생하는 경우,REINDEX명령은 실패하지만 뒤에 남깁니다.잘못됨기존 색인에 추가로 새 색인을 추가합니다. 이 토토는 불완전할 수 있으므로 쿼리 목적에서는 무시됩니다. 그러나 여전히 업데이트 오버헤드가 소모됩니다. 그만큼psql \d명령은 다음과 같은 색인을 보고합니다.잘못됨:

postgres=# \d 탭
       테이블 "public.tab"
 칼럼 |  유형 | 수정자
------+---------+-----------
 열 | 정수 |
인덱스:
    "idx" btree(열)
    "idx_ccnew" btree(열) 잘못된

색인이 표시된 경우잘못됨접미사가 붙음_ccnew이면 동시 작업 중에 생성된 임시 인덱스에 해당하며 권장되는 복구 방법은 다음을 사용하여 삭제하는 것입니다.토토 삭제, 그런 다음 시도동시에 REINDEX다시. 대신 잘못된 색인이 접미사로 붙은 경우_ccold, 삭제할 수 없는 원래 인덱스에 해당합니다. 권장되는 복구 방법은 적절한 재구축이 성공했으므로 해당 인덱스를 삭제하는 것입니다. 유효하지 않은 인덱스 이름의 접미사에 0이 아닌 숫자를 추가하여 고유하게 유지할 수 있습니다._ccnew1, _ccold2

정규 인덱스 빌드는 동일한 테이블에서 다른 일반 인덱스 빌드가 동시에 발생하도록 허용하지만 테이블에서는 한 번에 하나의 동시 인덱스 빌드만 발생할 수 있습니다. 두 경우 모두 테이블에 대한 다른 유형의 스키마 수정은 허용되지 않습니다. 또 다른 차이점은 일반REINDEX 테이블또는REINDEX 인덱스명령은 트랜잭션 블록 내에서 수행될 수 있지만동시에 REINDEX할 수 없습니다.

장기 실행 트랜잭션과 마찬가지로REINDEX테이블에서 동시 제거할 수 있는 튜플에 영향을 미칠 수 있습니다.진공다른 테이블에.

REINDEX 시스템지원하지 않음동시시스템 카탈로그는 동시에 다시 색인화될 수 없기 때문입니다.

또한 제외 제약 조건에 대한 인덱스는 동시에 다시 인덱스될 수 없습니다. 이러한 인덱스의 이름이 이 명령에서 직접 지정되면 오류가 발생합니다. 제외 제약 조건 인덱스가 있는 테이블이나 데이터베이스가 동시에 다시 인덱스화되면 해당 인덱스는 건너뜁니다. (이러한 인덱스를 재색인화하는 것은 가능합니다.동시옵션.)

각 백엔드 실행 중REINDEX다음에 진행 상황을 보고할 것입니다.pg_stat_progress_create_index보기. 보다섹션 28.4.2자세한 내용은.

단일 색인 재구축:

REINDEX 인덱스 my_index;

테이블의 모든 토토를 다시 작성내_테이블:

REINDEX 테이블 my_table;

시스템 인덱스가 이미 유효한지 신뢰하지 않고 특정 데이터베이스의 모든 인덱스를 다시 빌드합니다.

$ PGOPTIONS="-P" 내보내기
$ psql broken_db...
broken_db= REINDEX DATABASE broken_db;
broken_db= \q

재인덱싱이 진행되는 동안 관련 관계에 대한 읽기 및 쓰기 작업을 차단하지 않고 테이블의 토토를 재구축합니다.

테이블을 동시에 REINDEX 테이블 my_broken_table;

호환성

아무것도 없습니다REINDEXSQL 표준의 명령.

수정 사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.