이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 핫 : 문서 : 17 : 14 장. 성능 팁버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

11 장. 토토 꽁 머니 팁

쿼리 성능은 많은 것들의 영향을받을 수 있습니다. 일부 이들은 사용자가 조작 할 수 있지만 다른 사람들은 시스템의 기본 설계의 기본. 이 장 이해 및 조정에 대한 힌트를 제공Postgres토토 꽁 머니.

11.1. 사용설명

저자 :전자 ​​메일에서 Tom Lane이 작성했습니다 2000-03-27.

Postgresa쿼리 계획각 쿼리마다 제공됩니다. 쿼리 구조와 일치하는 올바른 계획을 선택하고 데이터의 속성은 상당히 중요합니다 토토 꽁 머니. 를 사용할 수 있습니다.설명시스템이 어떤 쿼리 계획을 작성하는지 확인하십시오. 질문. 불행히도, 계획 읽기는 a를받을 자격이있는 예술입니다 튜토리얼, 그리고 나는 하나를 쓸 시간이 없었습니다. 여기에 있습니다 빠르고 더러운 설명.

현재 인용 된 숫자는 다음과 같습니다.

  • 추정 시작 토토 꽁 머니 (출력 전 소비 시간 스캔이 시작될 수 있습니다 (예 : 정렬 시간) 마디).

  • 추정 총 토토 꽁 머니 (모든 튜플이 검색되는 경우 그들은 --- 한계가있는 쿼리가 부족할 수 있습니다. 예를 들어 총 토토 꽁 머니 지불).

  • 이 계획 노드에 의해 추정 된 행 출력 수 (다시 한 번도 한도에 관계없이).

  • 추정 평균 너비 (바이트) 출력 이 계획 노드.

비용은 디스크 페이지의 단위로 측정됩니다. (CPU 노력 추정은 일부를 사용하여 디스크 페이지 장치로 변환됩니다 상당히 임의의 퍼지 인자. 실험하고 싶다면 이러한 요소는 런타임 구성 목록을 참조하십시오 의 매개 변수관리자 가이드.)

상위 수준 노드의 비용이 모든 어린이 노드의 비용이 포함되어 있습니다. 또한 중요합니다 비용이 플래너/옵티마이저이저에 관심이 있습니다. 특히 비용은 그렇지 않습니다 결과 튜플을 전송하는 데 소요되는 시간을 고려하십시오 프론트 엔드 --- 이것은 진정한 경과 시간이지만 플래너는 그것을 무시할 수 없기 때문에 그것을 무시합니다. 계획을 변경하여 변경하십시오. (모든 정확한 계획이 출력됩니다 같은 튜플 세트, 우리는 신뢰합니다.)

행 출력은 약간 까다 롭기 때문에아님쿼리 --- 추정 된 것을 반영하는 것은 일반적으로 적습니다 Where-Clause 제약의 선택성 이 노드에 적용됩니다. 이상적으로 최상위 행 추정치는 의지합니다 실제로 반환, 업데이트 된 행 수에 근사하십시오 쿼리로 삭제 한계).

평균 너비는 정말 가짜입니다 가변 길이의 평균 길이에 대한 아이디어가 없습니다. 열. 나는 앞으로 그것을 개선 할 생각이지만 너비가 사용되지 않기 때문에 문제가되지 않을 수 있습니다. 아주 많이.

몇 가지 예가 있습니다 (회귀 테스트 데이터베이스 사용 진공 분석 후 거의 7.0 소스) :

regression =# 설명 *에서 10 ~ tenk1;
주목 : 쿼리 계획 :

Tenk1의 Seq 스캔 (비용 = 0.00..333.00 행 = 10000 너비 = 148)

이것은 얻는 것만 큼 간단합니다. 그렇다면

선택 *에서 pg_class에서 relname = 'tenk1';
Tenk1에는 233 개의 디스크 페이지와 10000이 있음을 알 수 있습니다. 튜플. 비용은 233 블록으로 추정되며 1.0으로 정의됩니다. 현재 0.01 인 10000 * CPU_TUPLE_COST (tryshow cpu_tuple_cost).

이제 자격을 추가하기 위해 쿼리를 수정합시다 절:

regression =# 설명 * tenk1에서 * 고유 한 <1000;
주목 : 쿼리 계획 :

Tenk1의 Seq 스캔 (비용 = 0.00..358.00 행 = 1000 너비 = 148)
출력 행의 추정치가 위치 절. (이 추정치는 Tenk1이기 때문에 매우 정확합니다 특히 간단한 경우 --- 고유 한 열에는 10000이 있습니다. 0에서 9999까지의 뚜렷한 값이므로 추정기의 선형 Min과 Max 열 값 사이의 보간은 죽음입니다.) 그러나 스캔은 여전히 ​​10000 행을 모두 방문해야하므로 비용은 감소하지 않았습니다. 사실 그것은 반영하기 위해 조금 올라갔습니다. 여분의 CPU 시간은 위치 조건을 확인하는 데 소요되었습니다.

자격을 제한하도록 쿼리를 수정하십시오 더:

regression =# 설명 * 10 <100;
주목 : 쿼리 계획 :

Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..89.35 행 = 100 너비 = 148)
그리고 당신은 우리가 위치 조건을 만들면 그것을 알게 될 것입니다. 선택적으로, 플래너는 결국 그것을 결정할 것입니다 IndexScan은 순차적 스캔보다 저렴합니다. 이 계획은 만 가능합니다 지수로 인해 100 개의 튜플을 방문해야하므로 그럼에도 불구하고 승리합니다. 각 개인이 비싸다는 사실.

자격에 다른 조건 추가 :

regression =# election * tenk1 where 1 <100 및
회귀-# stringu1 = 'xxx';
주목 : 쿼리 계획 :

Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..89.60 행 = 1 너비 = 148)
추가 된 조항 "stringu1 = 'xxx'"는 출력 행을 줄입니다 우리는 여전히 동일한 것을 방문해야하기 때문에 토토 꽁 머니은 예상치지만 튜플 세트.

우리가 있었던 필드를 사용하여 두 개의 테이블을 결합 해 보겠습니다. 토론 :

regression =# 설명 *에서 * Tenk1 T1, Tenk2 T2 여기서 t1.unique1 <100
회귀-# 및 t1.unique2 = t2.unique2;
주목 : 쿼리 계획 :

중첩 루프 (비용 = 0.00..144.07 행 = 100 너비 = 296)
  - tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔
             (비용 = 0.00..89.35 행 = 100 너비 = 148)
  - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔
             (비용 = 0.00..0.53 행 = 1 너비 = 148)

이 중첩 루프 조인에서 외부 스캔은 동일합니다. INDEXSCAN 우리는 지난 마지막 예제에 있었으므로 토토 꽁 머니 그리고 우리가 "고유 한 <100 "해당 노드에서 절하기."T1.unique2 = t2.uique2 "절은 아직 관련이 없으므로 외부 스캔의 행 카운트. 내부 스캔의 경우 전류 외부 스캔 튜플의 고유 2 값은 내부에 연결됩니다 "t2.unique2 =와 같은 인덱스 qual을 생성하려면 indexscanConstant". 그래서 우리는 동일한 내부 스캔을 얻습니다 우리가 얻을 수있는 계획과 토토 꽁 머니 : "선택 *에서 * Tenk2 where ighere2 = 42 ". 루프 노드의 토토 꽁 머니이 설정됩니다. 외부 스캔 토토 꽁 머니과 한 번의 반복에 기초하여 각 외부 튜플 (100 * 0.53, 여기)에 대한 내부 스캔, 그리고 조인 처리를위한 CPU 시간이 거의 없습니다.

이 예에서 루프의 출력 행 카운트는 다음과 같습니다. 두 스캔 행의 제품은 사실이 아니지만 사실이 아닙니다. 일반적으로, 일반적으로 조항이있는 곳을 가질 수 있기 때문입니다. 두 관계를 모두 언급하고 조인시에만 적용 할 수 있습니다. 입력 스캔이 아닌 포인트. 예를 들어, 추가하면 "어디서 ... 그리고 t1.10 <t2.hundred", 그것은 감소 할 것이다 결합 노드의 출력 행 카운트이지만 입력을 변경하지 않습니다. 주사.

변형 계획을 보는 한 가지 방법은 플래너에게 승자가 생각했던 전략을 사용하여 사용하십시오 각 계획 유형에 대한 플래그 활성화/비활성화. (이것은 원유입니다 도구이지만 유용합니다. 참조 참조섹션 11.2.)

회귀 =# set enable_nestloop = off;
변수를 설정하십시오
회귀 =# 설명 *에서 * Tenk1 T1, Tenk2 T2에서 t1.unique1 <100
회귀-# 및 t1.unique2 = t2.unique2;
주목 : 쿼리 계획 :

해시 조인 (비용 = 89.60..574.10 행 = 100 너비 = 296)
  - TENK2 T2에서 SEQ 스캔
               (비용 = 0.00..333.00 행 = 10000 너비 = 148)
  - 해시 (비용 = 89.35..89.35 행 = 100 너비 = 148)
        - tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔
               (비용 = 0.00..89.35 행 = 100 너비 = 148)
이 계획은 100 개의 흥미로운 행을 추출 할 것을 제안합니다. 당신과 같은 olde indexscan을 사용하여 tenk1을, 그들을 메모리에 보관하십시오. 해시 테이블, 그런 다음 Tenk2를 순차적으로 스캔하여 "t1.unique2 = t2.unique2"의 가능한 일치에 대한 해시 테이블 각 tenk2 튜플. Tenk1을 읽고 해시 테이블을 설정하는 데 드는 비용 우리는 아무것도 얻지 못하기 때문에 해시 조인의 스타트 업 비용입니다. Tenk2를 읽기 시작할 때까지 튜플. 총 시간 가입에 대한 추정에는 CPU에 대한 꽤 많은 비용이 포함됩니다. 해시 테이블을 10000 번 조사 할 시간. 그러나 우리는 주목하십시오 10000 회 89.35를 충전하지 않습니다. 해시 테이블 설정은 전용입니다 이 계획 유형에서 한 번 완료되었습니다.