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. 부분 스포츠 토토 베트맨 설정 흥미롭지 않은 값 제외
청구 및 채워지지 않은 테이블이있는 경우 구금되지 않은 주문이 약간의 일부를 차지하는 명령 총 테이블이지만 그것들은 가장 인정받은 행입니다. 단지 인덱스를 만들어 성능을 향상시킬 수 있습니다. 채워지지 않은 행. 인덱스를 작성하라는 명령은 모양입니다 이것:
주문에서 스포츠 토토 베트맨 orders_unbilled_index 만들기 (Order_nr) 청구가 사실이 아닌 곳;
이 색인을 사용할 수있는 쿼리는 다음과 같습니다.
선택 * 청구 된 명령에서 청구 된 명령 중에서는 사실이 아니며 Order_nr <10000;
그러나 인덱스는 그렇지 않은 쿼리에도 사용할 수 있습니다. 관련시키다Order_nr전혀, 예를 들어 :
선택 * 청구 된 명령에서 청구 된 명령에서 금액 5000.00;
이것은의 부분 스포츠 토토 베트맨만큼 효율적이지 않습니다.금액열은 이후입니다 시스템은 전체 인덱스를 스캔해야합니다. 그러나 있다면 이 부분 스포츠 토토 베트맨을 사용하여 비교적이지 않은 명령 실금되지 않은 명령을 찾는 것은 승리가 될 수 있습니다.
이 쿼리는이 스포츠 토토 베트맨을 사용할 수 없습니다.
선택 * 주문에서 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의 부분 스포츠 토토 베트맨 : 연구 프로젝트및일반화 된 부분 스포츠 토토 베트맨 (캐시 버전) .