이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은의 동일한 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 11.8. 사설 토토 무지개 토토버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

11.8. 부분 무지개 토토

a부분 무지개 토토는 구축 된 무지개 토토입니다 테이블의 하위 집합; 서브 세트는 조건부로 정의됩니다 표현식 (술어의 부분 무지개 토토). 인덱스에는 해당 테이블에 대해서만 항목이 포함되어 있습니다 술어를 만족시키는 행. 부분 무지개 토토은 전문화됩니다 기능이지만 몇 가지 상황이 있습니다. 유용한.

부분 무지개 토토을 사용하는 주요 이유 중 하나는 인덱싱을 피하는 것입니다. 일반적인 값. 공통 값을 검색하는 쿼리 이후 모든 테이블 행의 몇 % 이상을 차지합니다) 어쨌든 인덱스를 사용하지 않으면 그 행을 유지하는 데 아무런 의미가 없습니다. 색인에서. 이것은 인덱스의 크기를 줄입니다 인덱스를 사용하는 쿼리 속도를 높이십시오. 또한 속도가 높아집니다 인덱스가 필요하지 않기 때문에 많은 테이블 업데이트 작업 모든 경우에 업데이트되었습니다.예 11-1표시 a 이 아이디어의 가능한 적용.

예 11-1. 공통을 배제하기 위해 부분 무지개 토토을 설정합니다 값

데이터베이스에 웹 서버 액세스 로그를 저장하고 있다고 가정합니다. 대부분의 액세스는 귀하의 IP 주소 범위에서 비롯됩니다. 조직이지만 일부는 다른 곳에서 왔습니다 (예 : 전화 접속 직원 사이). IP의 검색이 주로 외부를위한 것인지 액세스, 아마도 IP 범위를 인덱싱 할 필요가 없을 것입니다 조직의 서브넷에 해당합니다.

다음과 같은 테이블을 가정합니다 :

테이블 생성 access_log (
    URL VARCHAR,
    client_ip inet,
    ...
);

우리의 예에 맞는 부분 무지개 토토을 만들려면 명령을 사용하십시오. 이와 같은 :

access_log (client_ip)에서 index access_log_client_ip_ix 만들기
(client_ip inet '192.168.100.0'및
           client_ip <inet '192.168.100.255');

이 색인을 사용할 수있는 일반적인 쿼리는 다음과 같습니다.

선택 *
Access_Log에서
여기서 url = '/index.html'및 client_ip = inet '212.78.10.32';

이 색인을 사용할 수없는 쿼리는 다음과 같습니다.

선택 *
Access_Log에서
여기서 client_ip = inet '192.168.100.23';

이런 종류의 부분 무지개 토토이 공통을 요구한다는 것을 관찰합니다. 값은 사전 결정되므로 그러한 부분 무지개 토토이 가장 잘 사용됩니다. 변경되지 않는 데이터 배포. 인덱스를 재현 할 수 있습니다 때때로 새로운 데이터 배포를 조정하기 위해 유지 보수 노력.

부분 무지개 토토에 대한 또 다른 사용은 값을 제외하는 것입니다. 일반적인 쿼리 워크로드가 관심이 없다는 인덱스에서 안에; 이것은에 표시됩니다.예 11-2. 이것 위에 나열된 것과 동일한 이점을 얻지 만를 방지합니다."무관심"존재의 가치 인덱스 스캔이 수익성이 있더라도 해당 지수를 통해 액세스 이 경우. 분명히, 이런 종류의 부분 무지개 토토을 설정합니다 시나리오의 많은 관리와 실험이 필요합니다.

예 11-2. 제외 할 부분 무지개 토토 설정 무관심 값

청구 및 실금이 포함 된 테이블이있는 경우 구금되지 않은 주문이 총 테이블이지만 가장 인기가 많은 행입니다. 달리지 않은 행에만 인덱스를 만들어 성능을 향상시킵니다. 색인을 생성하라는 명령은 다음과 같습니다.

주문에서 무지개 토토 주문 _unbilled_index 생성 (Order_nr)
    청구가 사실이 아닌 곳;

이 색인을 사용할 수있는 쿼리는 다음과 같습니다.

선택 * 청구 된 명령에서 청구 된 명령에서 rebliced <10000;

그러나 인덱스는 그렇지 않은 쿼리에도 사용할 수 있습니다. 관련시키다Order_nr전혀, 예를 들어 :

선택 * 청구 된 명령에서 청구 된 명령에서 금액 5000.00;

이것은의 부분 무지개 토토만큼 효율적이지 않습니다.금액시스템이 필요하기 때문에 열이 될 것입니다 전체 인덱스를 스캔하십시오. 그러나 실금되지 않은 채취가 상대적으로 거의 없다면 명령,이 부분 무지개 토토을 사용하여 달리지 않은 주문을 찾으십시오. 승리가 될 수 있습니다.

이 쿼리는이 무지개 토토을 사용할 수 없습니다.

select * Orders에서 Order_nr = 3501;

명령 3501은 청구되거나 청구되지 않은 명령 중 하나 일 수 있습니다.

예제 11-2또한 인덱스 된 열과 열을 보여줍니다 술어에 사용되는 것은 일치 할 필요가 없습니다.PostgreSQL부분 무지개 토토을 지원합니다 테이블의 기둥 만있는 한 임의의 사전은 색인이 관련되어 있습니다. 그러나 술어는해야한다는 것을 명심하십시오 예상되는 쿼리에 사용 된 조건과 일치 색인의 혜택. 정확히 말하면 부분 무지개 토토을 사용할 수 있습니다 시스템이를 인식 할 수있는 경우에만 쿼리에서여기서쿼리의 조건은 수학적으로 암시합니다 색인의 술어.PostgreSQL정교함이 없습니다 수학적으로 동등한 것을 인식 할 수있는 정리 전공 다른 형태로 작성된 표현. (그런 것뿐만 아니라 일반적인 이론 속도는 만들기가 매우 어렵습니다. 아마도 실제로 사용하기에는 너무 느리게 될 것입니다.) 시스템은 예를 들어 간단한 불평등 함의 인식"x <1"암시"x < 2 "; 그렇지 않으면 술어 조건이 정확히 일치해야합니다 쿼리의 일부여기서조건 또는 인덱스는 사용 가능한 것으로 인식되지 않습니다. 일치하는 것이 발생합니다 실행 시간이 아닌 쿼리 계획 시간. 결과적으로 매개 변수화 쿼리 조항은 부분 무지개 토토과 함께 작동하지 않습니다. 예를 들어 a 매개 변수가있는 준비된 쿼리가 지정할 수 있습니다"x <?"결코 암시하지 않을 것입니다"x <2"매개 변수.

부분 인덱스에 대한 세 번째 사용은 색인이 전혀 쿼리로 사용됩니다. 여기서 아이디어는 a를 만드는 것입니다 와 같이 테이블의 하위 집합에 대한 고유 인덱스예 11-3. 이것 인덱스를 만족시키는 행 사이의 독창성을 시행합니다 술어, 그렇지 않은 것을 제한하지 않고 술어.

예 11-3. 부분 고유 인덱스 설정

테스트 결과를 설명하는 테이블이 있다고 가정하십시오. 우리는 원합니다 하나만 있는지 확인하려면"성공"주어진 주제 및 목표에 대한 입력 조합이지만 수가 있습니다."실패"항목. 다음은해야 할 한 가지 방법이 있습니다 그것:

테이블 테스트 생성 (
    제목 텍스트,
    대상 텍스트,
    성공 부울,
    ...
);

테스트에서 고유 한 무지개 토토 생성 _success_constraint (주제, 대상)
    어디에서 성공;

이것은 거의 없을 때 특히 효율적인 접근법입니다. 성공적인 테스트와 실패한 많은 테스트.

마지막으로 부분 무지개 토토을 사용하여 시스템의 쿼리 계획 선택. 또한 특이한 데이터 세트 분포는 시스템이 실제로 인덱스를 사용하게 될 수 있습니다. 해서는 안됩니다. 이 경우 인덱스가 설정되지 않도록 설정할 수 있습니다. 불쾌한 쿼리에 사용할 수 있습니다. 보통,PostgreSQL합리적인 선택을합니다 인덱스 사용량 (예 : 공통 값을 검색 할 때 피하기하므로 이전 예는 실제로 인덱스 크기 만 저장하지만 인덱스 사용을 피하기 위해 필요) 및 심하게 잘못된 계획 선택 버그 보고서의 원인입니다.

부분 무지개 토토을 설정하면 적어도 쿼리 플래너가 알고있는만큼 알고 있습니다. 지수가 언제 수익성인지 알고 있습니다. 이 지식을 형성합니다 인덱스가 어떻게 지수에 대한 경험과 이해가 필요합니다PostgreSQL작업. 대부분의 경우 일반 색인에 대한 부분 무지개 토토의 장점은 최소.

부분 인덱스에 대한 자세한 내용은 참조 할 수 있습니다. 부분 무지개 토토 사례 , Postgres의 부분 무지개 토토 : 연구 프로젝트일반화 된 부분 무지개 토토 (캐시 버전) .