A 부분 토토 꽁 머니인덱스가 구축되었습니다. 테이블의 하위 집합에 대해; 하위 집합은 조건부로 정의됩니다. 표현식(이라고 함)술어의 부분 토토 꽁 머니). 인덱스에는 해당 테이블에 대한 항목만 포함됩니다. 술어를 만족하는 행. 부분 인덱스는 특수한 기능이지만 여러 가지 상황이 있습니다. 유용해요.
부분 토토 꽁 머니을 사용하는 주요 이유 중 하나는 공통 값을 인덱싱합니다. 공통 검색어를 검색한 이후 가치(전체 가치의 몇 퍼센트 이상을 차지하는 가치) 테이블 행) 어쨌든 인덱스를 사용하지 않으므로 의미가 없습니다. 해당 행을 인덱스에 전혀 유지하지 않습니다. 이렇게 하면 크기가 줄어듭니다. 인덱스를 사용하는 쿼리 속도를 높이는 인덱스입니다. 그것 또한 인덱스를 사용하면 많은 테이블 업데이트 작업 속도가 빨라집니다. 모든 경우에 업데이트할 필요는 없습니다.예 11-1쇼 이 아이디어의 가능한 적용.
예제 11-1. 부분 인덱스 설정 공통 값 제외
당신이 웹 서버 접근 로그를 데이터베이스. 대부분의 액세스는 다음 IP 주소 범위에서 발생합니다. 귀하의 조직이지만 일부는 다른 곳에서 왔습니다(예: 직원 전화 접속 연결 시). IP를 통한 검색이 주로 외부 액세스의 경우 IP를 인덱싱할 필요가 없을 수도 있습니다. 조직의 서브넷에 해당하는 범위입니다.
다음과 같은 테이블을 가정해보세요:
CREATE TABLE access_log(
URL varchar,
client_ip inet,
...
);
우리의 예에 적합한 부분 토토 꽁 머니을 생성하려면 다음과 같은 명령:
INDEX 생성 access_log_client_ip_ix ON access_log (client_ip)
WHERE NOT (client_ip inet '192.168.100.0' AND client_ip < inet '192.168.100.255');
이 색인을 사용할 수 있는 일반적인 쿼리는 다음과 같습니다:
SELECT * FROM access_log WHERE url = '/index.html' AND client_ip = inet '212.78.10.32';
이 색인을 사용할 수 없는 쿼리는 다음과 같습니다:
SELECT * FROM access_log WHERE client_ip = inet '192.168.100.23';
이런 종류의 부분 토토 꽁 머니에는 공통 값은 미리 결정됩니다. 가치분배라면 (애플리케이션의 특성으로 인해) 고유하고 정적입니다. (시간이 지나도 변하지 않음) 이는 어렵지 않습니다. 공통 값은 단지 우연한 데이터 로드로 인한 것입니다. 인덱스를 변경하려면 많은 유지 관리 작업이 필요할 수 있습니다. 때때로 정의합니다.
부분 토토 꽁 머니의 또 다른 가능한 용도는 값을 제외하는 것입니다 일반적인 쿼리 작업 부하가 관심이 없다는 인덱스에서 안으로; 이것은에 표시됩니다.예 11-2. 이 위에 나열된 것과 동일한 이점이 있지만"흥미롭지 않음"존재로부터의 가치 인덱스 스캔이 가능하더라도 해당 인덱스를 통해 액세스할 수 있습니다. 이 경우 수익성이 있습니다. 분명히 부분 인덱스 설정 이런 종류의 시나리오에는 많은 주의가 필요하며 실험.
예제 11-2. 부분 인덱스 설정 흥미롭지 않은 값 제외
청구된 것과 청구되지 않은 것이 모두 포함된 테이블이 있는 경우 청구되지 않은 주문이 작은 부분을 차지하는 주문 전체 테이블이 가장 많이 액세스된 행이기는 하지만 단지 인덱스를 생성하여 성능을 향상시킬 수 있습니다. 청구되지 않은 행. 인덱스를 생성하는 명령은 다음과 같습니다. 이:
CREATE INDEX 주문_unbilled_index ON 주문(order_nr)
청구된 곳이 사실이 아닙니다.
이 색인을 사용하기 위한 가능한 쿼리는 다음과 같습니다:
SELECT * FROM 주문이 청구된 곳이 true가 아니며 order_nr < 10000;
그러나 색인은 다음과 같은 쿼리에도 사용될 수 있습니다. 참여하다order_nr전혀, 예:
SELECT * FROM 주문이 청구된 곳이 사실이 아니며 금액이 5000.00보다 큽니다;
이것은 부분 토토 꽁 머니만큼 효율적이지 않습니다.금액열은 다음과 같습니다. 시스템은 전체 인덱스를 스캔해야 합니다. 그래도 만약 있다면 이 부분 토토 꽁 머니을 사용하면 미청구 주문이 상대적으로 적습니다. 청구되지 않은 주문을 찾는 것이 유리할 수 있습니다.
이 쿼리는 이 토토 꽁 머니을 사용할 수 없습니다.
SELECT * FROM 주문 WHERE order_nr = 3501;
주문 3501은 청구된 항목 또는 다음 항목 중 하나일 수 있습니다. 청구되지 않은 주문입니다.
예 11-2또한 인덱싱된 열과 열이 술어에 사용된 것은 일치할 필요가 없습니다.PostgreSQL다음을 사용하여 부분 토토 꽁 머니을 지원합니다. 테이블의 열만 존재하는 한 임의의 술어 색인이 포함되어 있습니다. 그러나 술어는 다음과 같습니다. 가정된 쿼리에 사용된 조건과 일치해야 합니다. 지수로부터 이익을 얻습니다. 정확하게 말하면 부분 인덱스는 다음과 같습니다. 시스템이 다음을 인식할 수 있는 경우에만 쿼리에 사용됩니다.어디쿼리 조건 수학적으로 색인의 술어를 의미합니다.PostgreSQL정교한 기능이 없습니다 수학적으로 등가물을 인식할 수 있는 정리 증명자 다양한 형태로 쓰여진 표현들. (이뿐만 아니라 그러한 일반 정리 증명자는 만들기가 매우 어렵습니다. 실제로 사용하기에는 너무 느릴 수 있습니다.) 시스템은 예를 들어 단순한 불평등의 의미를 인식합니다."x < 1"암시"x < 2"; 그렇지 않은 경우 술어 조건은 다음과 같아야 합니다. 쿼리의 일부와 정확히 일치함어디조건 또는 색인이 사용 가능한 것으로 인식되지 않습니다. 일치는 런타임이 아닌 쿼리 계획 시간에 발생합니다. 다음과 같이 결과적으로 매개변수화된 쿼리 절은 부분 인덱스. 예를 들어 매개변수가 있는 준비된 쿼리 지정할 수 있음"x < ?"그것은 절대 암시하지 마세요"x < 2"모두를 위한 매개변수의 가능한 값입니다.
부분 토토 꽁 머니의 세 번째 가능한 사용에는 다음이 필요하지 않습니다. 쿼리에 전혀 사용되지 않는 인덱스입니다. 여기서 아이디어는 다음과 같이 테이블의 하위 집합에 대한 고유 인덱스입니다.예제 11-3. 이 인덱스를 만족하는 행 사이에 고유성을 적용합니다. 그렇지 않은 것을 제한하지 않고 술어.
예제 11-3. 부분 고유 설정 색인
테스트 결과를 설명하는 테이블이 있다고 가정합니다. 우리 하나만 있는지 확인하고 싶습니다."성공했습니다"주어진 주제에 대한 항목 및 대상 조합은 여러 개일 수 있지만 여러 개가 있을 수 있습니다."실패"항목. 여기 하나가 있습니다 방법:
CREATE TABLE 테스트(
주제 텍스트,
대상 텍스트,
성공 부울,
...
);
CREATE UNIQUE INDEX 테스트_success_constraint ON 테스트(주제, 대상)
어디에서 성공;
이것은 특히 효율적인 방법입니다. 성공적인 테스트는 거의 없고 실패한 테스트는 많습니다.
마지막으로 부분 토토 꽁 머니을 사용하여 시스템의 쿼리 계획 선택. 또한, 특이한 데이터 세트 배포로 인해 시스템이 인덱스를 사용하게 될 수 있습니다. 정말 안됩니다. 이 경우 인덱스를 다음과 같이 설정할 수 있습니다. 문제가 되는 쿼리에는 사용할 수 없습니다. 일반적으로,PostgreSQL합리적이다 인덱스 사용에 대한 선택(예: 검색 시 이를 피함) 공통 값이므로 이전 예에서는 실제로 인덱스만 저장합니다. 크기 때문에 인덱스 사용을 피할 필요는 없습니다.) 잘못된 계획 선택으로 인해 버그 신고가 발생합니다.
부분 토토 꽁 머니 설정은 다음을 의미한다는 점을 명심하십시오. 당신은 최소한 쿼리 플래너가 아는 만큼만 알고 있습니다. 특히 인덱스가 언제 수익을 낼 수 있는지 알 수 있습니다. 성형 이 지식에는 경험과 이해가 필요합니다. 인덱스PostgreSQL일. 에서 대부분의 경우 일반 인덱스에 비해 부분 인덱스의 장점 많지는 않을 거예요.
부분 토토 꽁 머니에 대한 자세한 내용은 다음에서 찾을 수 있습니다. 부분 토토 꽁 머니의 경우 , POSTGRES의 부분 토토 꽁 머니 생성: 연구 프로젝트및일반화된 부분 토토 꽁 머니 (캐시된 버전) .