이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 11.8. 사설 토토 토토 꽁 머니버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

11.8. 부분 토토 꽁 머니

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

부분 토토 꽁 머니을 사용하는 주요 이유 중 하나는 피하는 것입니다. 공통 값을 색인화합니다. 공통을 검색하는 쿼리 이후 가치 (모든 것의 몇 % 이상을 차지하는 사람 테이블 행) 어쨌든 인덱스를 사용하지 않으며 그 행을 색인에 보관합니다. 이것은 크기를 줄입니다 인덱스를 사용하는 쿼리 속도를 높이는 인덱스. 그것 인덱스이기 때문에 많은 테이블 업데이트 작업 속도를 높일 것입니다. 모든 경우에 업데이트 될 필요는 없습니다.예 11-1쇼 이 아이디어의 적용 가능.

예 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');

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

선택 *에서 ac

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

선택 * ac

이런 종류의 부분 토토 꽁 머니이 공통 값은 사전 결정됩니다. 값 분포 인 경우 고유 (응용 프로그램의 특성으로 인해) 및 정적입니다. (시간이 지남에 따라 변하지 않음), 이것은 어렵지 않지만 공통 값은 단지 우연의 데이터로드로 인한 것입니다. 색인 변경을 위해 많은 유지 보수 작업이 필요할 수 있습니다. 때때로 정의.

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

예 11-2. 부분 토토 꽁 머니 설정 흥미롭지 않은 값 제외

청구 및 실금이 포함 된 테이블이있는 경우 구금되지 않은 주문이 약간의 일부를 차지하는 명령 총 테이블이지만 그것들은 가장 인정받은 행입니다. 단지 인덱스를 만들어 성능을 향상시킬 수 있습니다. 채워지지 않은 행. 인덱스를 작성하라는 명령은 모양입니다 이것:

주문에서 토토 꽁 머니 orders_unbilled_index 만들기 (Order_nr)
    청구가 사실이 아닌 곳;

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

선택 * 청구 된 명령에서 청구 된 명령 중에서 주문 _nr <10000;

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

선택 * 청구 된 명령에서 청구 된 명령 중에서는 사실이 아니고 금액 5000.00;

이것은의 부분 토토 꽁 머니만큼 효율적이지 않습니다.금액열은 이후입니다 시스템은 전체 인덱스를 스캔해야합니다. 그러나 있다면 이 부분 토토 꽁 머니을 사용하여 비교적이지 않은 명령 실금되지 않은 명령을 찾는 것은 승리가 될 수 있습니다.

이 쿼리는이 토토 꽁 머니을 사용할 수 없습니다.

select * Orders에서 Order_nr = 3501;

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

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

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

예 11-3. 부분적 고유 한 설정 색인

테스트 결과를 설명하는 테이블이 있다고 가정하십시오. 우리 하나만 있는지 확인하고 싶습니다"성공"주어진 주제에 대한 입장 대상 조합이지만 수가 있습니다."실패"항목. 여기 하나가 있습니다 그렇게하는 방법 :

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

테스트에서 고유 한 토토 꽁 머니 생성 _success_constraint (주제, 대상)
    어디에서 성공;

이것은 거기에있을 때 특히 효율적인 방법입니다. 성공적인 테스트는 거의없고 실패한 많은 테스트입니다.

마지막으로 부분 토토 꽁 머니을 사용하여 시스템의 쿼리 계획 선택. 또한 특이한 데이터 세트 분포는 시스템이 인덱스를 사용하게 될 수 있습니다. 정말 그렇지 않아야합니다. 이 경우 인덱스를 설정하여 불쾌한 쿼리에는 사용할 수 없습니다. 보통,PostgreSQL합리적입니다 인덱스 사용에 대한 선택 (예 : 검색시 피해 일반적인 값이므로 이전 예제는 실제로 인덱스를 저장합니다. 크기, 인덱스 사용을 피할 필요는 없습니다). 잘못된 계획 선택은 버그 보고서의 원인입니다.

부분 토토 꽁 머니을 설정하면 당신은 적어도 쿼리 플래너가 알고있는만큼 알고 있습니다. 특히 지수가 수익성이있을 때를 알고 있습니다. 형성 이 지식은 방법에 대한 경험과 이해가 필요합니다 인덱스PostgreSQL작업. ~ 안에 대부분의 경우, 일반 색인에 대한 부분 토토 꽁 머니의 장점 그다지 많지 않을 것입니다.

부분 토토 꽁 머니에 대한 자세한 내용은 찾을 수 있습니다. 부분 토토 꽁 머니의 사례 , Postgres의 부분 토토 꽁 머니 : 연구 프로젝트일반화 된 부분 토토 꽁 머니 (캐시 버전) .