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

챕터 10. 성능 팁

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

10.1. 윈 토토설명

PostgreSQLa쿼리 계획각 쿼리마다 제공됩니다. 쿼리 구조와 일치하는 올바른 계획을 선택하고 데이터의 속성은 상당히 중요합니다 성능. 를 윈 토토할 수 있습니다.설명시스템이 어떤 쿼리 계획을 작성하는지 확인하십시오. 질문. 계획 읽기는 광범위한 가치가있는 예술입니다 그렇지 않은 튜토리얼; 그러나 여기에 몇 가지 기본이 있습니다 정보.

현재 인용 한 숫자설명are :

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

  • 추정 총 비용 (모든 행을 검색 한 경우 그들은 아닐 수도 있습니다 --- aLimit조항은 지불이 부족합니다 예를 들어 총 비용.)

  • 이 계획 노드에 의한 추정 행 출력 수 (다시, 완료에 실행 된 경우에만.)

  • 예상 평균 너비 (바이트) 출력 이 계획 노드

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

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

행 출력은 약간 까다 롭기 때문에not행 수 쿼리에 의해 처리/스캔 --- 일반적으로 적고, 임의의 추정 선택성을 반영여기서-적용중인 클라스 제약 조건 이 노드에서. 이상적으로 최상위 행 추정치는 의지합니다 실제로 반환, 업데이트 된 행 수에 근사하십시오 쿼리로 삭제되었습니다.

몇 가지 예가 있습니다 (회귀 테스트 데이터베이스 윈 토토 후진공 분석및 7.3 개발 소스) :

회귀 =# 설명 *에서 10에서 선택하십시오.
                         쿼리 계획
----------------------------------------------------------------------------------
 Tenk1의 Seq 스캔 (비용 = 0.00..333.00 행 = 10000 너비 = 148)

이것은 간단합니다. 그렇다면

선택 *에서 pg_class where relname = 'tenk1';

당신은 그것을 알게 될 것입니다Tenk1에는 233 개의 디스크 페이지와 10000 행이 있습니다. 따라서 비용은 추정됩니다 233 페이지 읽기, 각각 1.0 명으로 정의되고 10000 *cpu_tuple_cost현재입니다 0.01 (tryshow cpu_tuple_cost).

이제 쿼리를 수정하겠습니다여기서조건 :

regression =# election * tenk1 where ightor1 <1000;
                         쿼리 계획
-------------------------------------------------------------------
 Tenk1의 Seq 스캔 (비용 = 0.00..358.00 행 = 1033 너비 = 148)
   필터 : (고유 한 <1000)

출력 행의 추정치가 |여기서절. 그러나 스캔이 될 것입니다 여전히 10000 행을 모두 방문해야하므로 비용은 감소; 사실 그것은 추가를 반영하기 위해 조금 올라갔습니다. CPU 시간을 확인하는 데 소요되는 시간여기서조건.

이 쿼리가 선택한 실제 행 수는 1000입니다. 그러나 추정치는 대략적인 것입니다. 복제하려고한다면 이 실험은 아마도 약간 다를 것입니다 추정; 또한, 각 이후에 변경됩니다.분석통계가 생성 되었기 때문에 명령 에 의해분석는 무작위로 가져옵니다 테이블의 샘플.

조건을 훨씬 더 제한하도록 쿼리 수정 :

regression =# elect * tenk1에서 extion * select * where 1 <50;
                                   쿼리 계획
---------------------------------------------------------------------------------------------------------------------------------------------------------.
 Tenk1에서 Tenk1_unique1을 윈 토토한 인덱스 스캔 (비용 = 0.00..179.33 행 = 49 너비 = 148)
   색인 조건 : (고유 1 <50)

그리고 당신은 우리가 그것을 만들면 그것을 볼 수 있습니다.여기서조건으로 충분히 선택적, 플래너 결국 인덱스 스캔이 순차적 스캔. 이 계획은 50 행만 방문하면됩니다 지수로 인해 개별 페치는 전체 디스크를 읽는 것보다 비쌉니다. 순차적으로 페이지.

다른 조항 추가여기서조건 :

regression =# election * tenk1 where 1 <50 및
회귀-# stringu1 = 'xxx';
                                  쿼리 계획
---------------------------------------------------------------------------------------------------------------------------------------------------------.
 Tenk1에서 Tenk1_unique1을 윈 토토한 인덱스 스캔 (비용 = 0.00..179.45 행 = 1 너비 = 148)
   색인 조건 : (고유 1 <50)
   필터 : (stringu1 = 'xxx':: name)

추가 된 절StringU1 = 'xxx'출력 행 추정치를 줄이지 만 우리는 비용이 들지 않습니다. 여전히 같은 행 세트를 방문해야합니다.StringU1절은 다음과 같이 적용 할 수 없습니다 인덱스 조건 (이 인덱스에만이므로고유 1열). 대신 a로 적용됩니다 인덱스에 의해 검색된 행을 필터링합니다. 따라서 비용은 있습니다 실제로이 추가를 반영하기 위해 조금 올라갔습니다. 점검.

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

regression =# 설명 *에서 * Tenk1 T1, Tenk2 T2 여기서 t1.unique1 <50
회귀-# 및 t1.unique2 = t2.unique2;
                               쿼리 계획
--------------------------------------------------------------------------------
 중첩 루프 (비용 = 0.00..327.02 행 = 49 너비 = 296)
   - tenk1 t1에서 tenk1_unique1을 윈 토토한 인덱스 스캔
                                      (비용 = 0.00..179.33 줄 = 49 너비 = 148)
         색인 조건 : (고유 1 <50)
   - tenk2 t2에서 tenk2_unique2를 윈 토토한 인덱스 스캔
                                      (비용 = 0.00..3.01 행 = 1 너비 = 148)
         색인 조건 : ( "외부".unique2 = t2.unique2)

이 중첩 루프 조인에서 외부 스캔은 동일한 색인입니다. 마지막으로 예제에서 스캔 했으므로 비용과 행 카운트는 우리가 적용하기 때문에 동일합니다고유 한 <50 여기서해당 노드의 절. 그만큼t1.unique2 = t2.uique2절은 아직 관련이 없으므로 그렇지 않습니다 외부 스캔의 행 수에 영향을 미칩니다. 내부 스캔의 경우고유 2현재의 가치 외부 스캔 행은 내부 색인 스캔에 연결되어 생산됩니다. 와 같은 색인 조건t2.unique2 =Constant. 그래서 우리는 동일한 내부 스캔 계획과 우리가 얻은 비용, 예를 들어onirect *에서 10을 선택하십시오 42. 루프 노드의 비용은 기준으로 설정됩니다. 외부 스캔 비용과 내부의 반복이 반복됩니다. 각 외부 행 (49 * 3.01, 여기)과 작은 CPU를 스캔합니다. 가입 처리 시간.

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

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

회귀 =# set enable_nestloop = off;
세트
회귀 =# 설명 *에서 * Tenk1 T1, Tenk2 T2 여기서 t1.unique1 <50
회귀-# 및 t1.unique2 = t2.unique2;
                               쿼리 계획
------------------------------------------------------------------------------------------
 해시 조인 (비용 = 179.45..563.06 행 = 49 너비 = 296)
   해시 조건 : ( "외부".unique2 = "내부".unique2)
   - tenk2 t2의 seq 스캔 (비용 = 0.00..333.00 행 = 10000 너비 = 148)
   - 해시 (비용 = 179.33..179.33 줄 = 49 너비 = 148)
         - tenk1 t1에서 tenk1_unique1을 윈 토토한 인덱스 스캔
                                    (비용 = 0.00..179.33 줄 = 49 너비 = 148)
               색인 조건 : (고유 1 <50)

이 계획은 50 개의 흥미로운 행을 추출 할 것을 제안합니다.TENK1같은 Olde Index를 윈 토토합니다 스캔하고 메모리 해시 테이블에 보관 한 다음 순차적 스캔Tenk2, 가능한 일치에 대한 해시 테이블에 대한 조사t1.unique2 = t2.unique2각각Tenk2행. 읽는 비용Tenk1해시 테이블을 설정하는 것은 전적으로입니다 해시 조인의 시작 비용, 우리는 행을 얻지 못하므로 읽기 시작할 때까지Tenk2. 가입의 총 시간 추정치 또한 해시를 조사하기위한 CPU 시간에 대한 무거운 요금도 포함되어 있습니다. 표 10000 회. 그러나 우리는not10000 회 충전 179.33; 해시 테이블 설정은이 계획 유형에서 한 번만 수행됩니다.

플래너의 정확도를 확인할 수 있습니다. 윈 토토하여 예상 비용설명 분석. 이 명령은 실제로 쿼리를 실행합니다 그런 다음 각 계획에 누적 된 실제 실행 시간을 표시합니다. 평범한 것과 동일한 추정 비용과 함께 노드설명쇼. 예를 들어, 우리는 할 수 있습니다 다음과 같은 결과를 얻으십시오 :

회귀 =# 분석을 설명하십시오
회귀-# 선택 * Tenk1 T1, Tenk2 T2에서
회귀-# 여기서 t1.unique1 <50 및 t1.unique2 = t2.unique2;
                                   쿼리 계획
---------------------------------------------------------------------------------------------------------------------------------------------------------.
 중첩 루프 (비용 = 0.00..327.02 행 = 49 너비 = 296)
                                 (실제 시간 = 1.18..29.82 행 = 50 루프 = 1)
   - tenk1 t1에서 tenk1_unique1을 윈 토토한 인덱스 스캔
                  (비용 = 0.00..179.33 줄 = 49 너비 = 148)
                                 (실제 시간 = 0.63..8.91 행 = 50 루프 = 1)
         색인 조건 : (고유 1 <50)
   - tenk2 t2에서 tenk2_unique2를 윈 토토한 인덱스 스캔
                  (비용 = 0.00..3.01 행 = 1 너비 = 148)
                                 (실제 시간 = 0.29..0.32 행 = 1 루프 = 50)
         색인 조건 : ( "외부".unique2 = t2.unique2)
 총 런타임 : 31.60msec

"실제 시간"값은 실시간 밀리 초, 반면"비용"추정치가 표시됩니다 디스크 페치의 임의의 단위; 그래서 그들은 일치하지 않을 것입니다 위로. 주의를 기울여야 할 것은 비율입니다.

일부 쿼리 계획에서는 하위 플랜 노드가 가능합니다. 두 번 이상 실행되었습니다. 예를 들어, 내부 색인 스캔은 다음과 같습니다 위의 중첩 루프 계획에서 외부 행당 한 번 실행됩니다. ~ 안에 그러한 경우,"루프"값 노드의 총 실행 수를보고합니다. 표시된 실제 시간 및 행 값은 실행 중 평균입니다. 이것은 숫자를 그 방식과 비교할 수 있도록하기 위해 비용 추정치가 표시됩니다. 곱하기"루프"실제로 총 시간을 얻는 값 노드에서 보냈습니다.

the총 런타임표시분석 설명집행자 포함 스타트 업 및 종료 시간, 처리 시간뿐만 아니라 처리 시간 결과 행. 구문 분석, 재 작성, 또는 포함되지 않습니다 계획 시간. Aselect쿼리, the 총 런 타임은 일반적으로 최상위 계획 노드에 대해보고 된 총 시간. 을 위한삽입, 업데이트삭제명령, 총 실행 시간 소비 된 시간이 포함되어 있기 때문에 상당히 클 수 있습니다. 결과 행을 처리합니다. 이 명령에서 최상위 계획 노드는 본질적으로 새로운 계산에 소요되는 시간입니다. 행 및/또는 오래된 것들을 찾는 줄이지만 변화하는 데 소요되는 시간.

주목할 가치가 있습니다설명결과는 하나는 실제로 테스트하고 있습니다. 예를 들어, a 장난감 크기의 테이블은 큰 테이블에 적용되는 것으로 가정 할 수 없습니다. 그만큼 플래너의 비용 추정치는 선형이 아니므로 잘 할 수 있습니다. 더 크거나 작은 테이블에 대한 다른 계획을 선택하십시오. an 극단적 인 예는 하나의 디스크 만 차지하는 테이블에 있습니다. 페이지, 당신은 거의 항상 순차적 스캔 계획을 얻을 수 있습니다. 인덱스를 윈 토토할 수 있습니다. 플래너는 그 사실을 알고 있습니다 하나의 디스크 페이지를 읽으려면 테이블을 처리하려면 케이스, 추가 페이지 읽기를 소비하는 데 가치가 없습니다. 색인을보세요.