Postgresql 9.1.24 문서화 | ||||
---|---|---|---|---|
사설 토토 : 문서 : 9.1 : 표현식 색인 | up | 11 장. 인덱스 | 다음 |
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');
이 색인을 사용할 수있는 일반적인 쿼리는 다음과 같습니다.
선택 * 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. 토토 캔 색인 설정 흥미롭지 않은 값 제외
청구 및 실금이 포함 된 테이블이있는 경우 구금되지 않은 주문이 약간의 일부를 차지하는 명령 총 테이블이지만 그것들은 가장 인정받은 행입니다. 단지 인덱스를 만들어 성능을 향상시킬 수 있습니다. 채워지지 않은 행. 인덱스를 작성하라는 명령은 모양입니다 이것:
주문에서 index orders_unbilled_index 만들기 (Order_nr) 청구가 사실이 아닌 곳;
이 색인을 사용할 수있는 쿼리는 다음과 같습니다.
선택 * 청구 된 명령에서 청구 된 명령에서 rebliced <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 (주제, 대상) 어디에서 성공;
이것은 거의 없을 때 특히 효율적인 접근법입니다. 성공적인 테스트와 실패한 많은 테스트.
마지막으로 토토 캔 색인을 사용하여 시스템의 쿼리 계획 선택. 또한 특이한 데이터 세트 분포는 시스템이 인덱스를 사용하게 될 수 있습니다. 정말 그렇지 않아야합니다. 이 경우 인덱스를 설정하여 불쾌한 쿼리에는 사용할 수 없습니다. 보통,18618_18630합리적입니다 인덱스 사용에 대한 선택 (예 : 검색시 피해 일반적인 값이므로 이전 예제는 실제로 인덱스를 저장합니다. 크기, 인덱스 사용을 피할 필요는 없습니다). 잘못된 계획 선택은 버그 보고서의 원인입니다.
토토 캔 색인을 설정하면 당신은 적어도 쿼리 플래너가 알고있는만큼 알고 있습니다. 특히 지수가 수익성이있을 때를 알고 있습니다. 형성 이 지식은 방법에 대한 경험과 이해가 필요합니다 인덱스PostgreSQL작업. ~ 안에 대부분의 경우, 일반 색인에 대한 토토 캔 색인의 장점 최소화됩니다.
토토 캔 색인에 대한 자세한 내용은 찾을 수 있습니다. 토토 캔 색인의 사례 , Postgres의 토토 캔 색인 : 연구 프로젝트및일반화 된 토토 캔 색인 (캐시 버전) .