쿼리 성능은 많은 것들의 영향을받을 수 있습니다. 일부 이들은 사용자가 조작 할 수 있지만 다른 사람들은 시스템의 기본 설계의 기본. 이 장 이해 및 조정에 대한 힌트를 제공스포츠 토토 베트맨스포츠 토토 베트맨.
스포츠 토토 베트맨a쿼리 계획각 쿼리마다 제공됩니다. 쿼리 구조와 일치하는 올바른 계획을 선택하고 데이터의 속성은 상당히 중요합니다 스포츠 토토 베트맨. 를 사용할 수 있습니다.설명시스템이 어떤 쿼리 계획을 작성하는지 확인하십시오. 질문. 계획 읽기는 광범위한 가치가있는 예술입니다 그렇지 않은 튜토리얼; 그러나 여기에 몇 가지 기본이 있습니다 정보.
현재 인용 한 숫자설명are :
추정 시작 스포츠 토토 베트맨 (출력 전 소비 시간 스캔이 시작될 수 있습니다 (예 : 정렬 시간) 마디).
예상 총 스포츠 토토 베트맨 (모든 튜플이 검색되는 경우 그들은 --- 한계가있는 쿼리가 부족할 수 있습니다. 예를 들어 총 스포츠 토토 베트맨 지불).
이 계획 노드에 의한 추정 행 출력 수 (다시 한 번도 한도에 관계없이).
행의 추정 평균 너비 (바이트) 출력 이 계획 노드.
비용은 디스크 페이지의 단위로 측정됩니다. (CPU 노력 추정은 일부를 사용하여 디스크 페이지 장치로 변환됩니다 상당히 임의의 퍼지 인자. 실험하고 싶다면 이러한 요소는 런타임 구성 목록을 참조하십시오 의 매개 변수관리자 가이드.)
상위 수준 노드의 비용이 모든 어린이 노드의 비용이 포함되어 있습니다. 또한 중요합니다 비용이 플래너/옵티마이저이저에 관심이 있습니다. 특히 비용은 그렇지 않습니다 결과 튜플을 전송하는 데 소요되는 시간을 고려하십시오 프론트 엔드 --- 이것은 진정한 경과 시간이지만 플래너는 그것을 무시할 수 없기 때문에 그것을 무시합니다. 계획을 변경하여 변경하십시오. (모든 정확한 계획이 출력됩니다 같은 튜플 세트, 우리는 신뢰합니다.)
행 출력은 약간 까다 롭기 때문에not행 수 쿼리에 의해 처리/스캔 --- 일반적으로 적고, 임의의 Wher-Clase의 추정 선택성을 반영합니다 이 노드에 적용되는 제약 조건. 이상적으로 최상위 행 추정치는 행의 수에 근사합니다 쿼리에서 실제로 반환, 업데이트 또는 삭제되었습니다.
몇 가지 예가 있습니다 (회귀 테스트 데이터베이스 사용 진공 분석 및 7.2 개발 소스 후) :
회귀 =# 설명 *에서 10에서 선택하십시오. 주목 : 쿼리 계획 : Tenk1의 Seq 스캔 (비용 = 0.00..333.00 행 = 10000 너비 = 148)
이것은 간단합니다. 그렇다면
선택 *에서 pg_class where relname = 'tenk1';
당신은 그것을 알게 될 것입니다Tenk1
에는 233 개의 디스크 페이지와 10000 개의 튜플이 있습니다. 따라서 스포츠 토토 베트맨은 추정됩니다
233 페이지의 페이지에서 1.0으로 정의 된 233 페이지, + 10000 *cpu_tuple_cost
현재입니다
0.01 (tryshow cpu_tuple_cost).
이제 자격을 추가하기 위해 쿼리를 수정합시다 절:
regression =# election * tenk1 where 1 <1000; 주목 : 쿼리 계획 : Tenk1의 Seq 스캔 (비용 = 0.00..358.00 행 = 1007 너비 = 148)
출력 행의 추정치가 위치 절. 그러나 스캔은 여전히 모든 것을 방문해야합니다 10000 행, 따라서 스포츠 토토 베트맨이 줄어들지 않았습니다. 사실 그것은 사라졌습니다 여분의 CPU 시간을 어디에서 확인하는 데 소요되는 시간을 반영합니다 상태.
이 쿼리가 선택한 실제 행 수는 1000, 그러나 추정치는 대략적인 것입니다. 복제하려고한다면 이 실험은 아마도 약간 다를 것입니다 추정; 또한, 각 이후에 변경됩니다.분석통계가 생성 되었기 때문에 명령 에 의해분석는 무작위로 가져옵니다 테이블의 샘플.
자격을 제한하도록 쿼리를 수정하십시오 더:
regression =# 설명 * 10 <50에서 10 <50; 주목 : 쿼리 계획 : Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..181.09 행 = 49 너비 = 148)
그리고 당신은 우리가 위치 조건을 만들면 그것을 알게 될 것입니다. 선택적으로, 플래너는 결국 그것을 결정할 것입니다 인덱스 스캔은 순차적 스캔보다 저렴합니다. 이 계획은 할 것입니다 색인으로 인해 50 개의 튜플 만 방문하면됩니다. 각 개인 페치가 더 비싸다는 사실에도 불구하고 전체 디스크 페이지를 순차적으로 읽는 것보다.
자격에 다른 조건 추가 :
regression =# election * tenk1 where 1 <50 및 회귀-# stringu1 = 'xxx'; 주목 : 쿼리 계획 : Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..181.22 행 = 1 너비 = 148)
추가 된 절Stri스포츠 토토 베트맨U1 = 'xxx'출력 행 추정치를 줄이지 만 스포츠 토토 베트맨은 아닙니다. 여전히 같은 튜플 세트를 방문해야합니다.
우리가 있었던 필드를 사용하여 두 개의 테이블을 결합 해 보겠습니다. 토론 :
regression =# 설명 *에서 * tenk1 t1, tenk2 t2 여기서 t1.unique1 <50 회귀-# 및 t1.unique2 = t2.unique2; 주목 : 쿼리 계획 : 중첩 루프 (비용 = 0.00..330.41 행 = 49 너비 = 296) - tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..181.09 줄 = 49 너비 = 148) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.00..3.01 행 = 1 너비 = 148)
이 중첩 루프 조인에서 외부 스캔은 동일한 색인입니다. 마지막으로 예제에서 스캔 했으므로 스포츠 토토 베트맨과 행 카운트는 우리가 적용하기 때문에 동일합니다고유 한 <50해당 노드의 절차. 그만큼t1.unique2 = t2.unique2절은 그렇지 않습니다 아직 관련이 있으므로 외부 스캔의 행 수에 영향을 미치지 않습니다. 내부 스캔의 경우 현재 외부 스캔의 고유 한 값 튜플은 인덱스를 생성하기 위해 내부 색인 스캔에 연결됩니다. 자격 :t2.unique2 =Constant. 그래서 우리는 똑같이 얻습니다 내부 스캔 계획과 우리가 얻는 스포츠 토토 베트맨, 예를 들어설명을 선택하십시오 * tenk2에서 where where 2 = 42. 루프 노드의 스포츠 토토 베트맨은 외부 스캔 스포츠 토토 베트맨과 내부 스캔의 반복 각 외부 튜플 (49 * 3.01, 여기)과 약간의 CPU 시간에 대해 가입 처리.
이 예에서 루프의 출력 행 카운트는 다음과 같습니다. 두 스캔 행의 제품은 사실이 아니지만 사실이 아닙니다. 일반적으로, 일반적으로 조항이있는 곳을 가질 수 있기 때문입니다. 두 관계를 모두 언급하고 조인시에만 적용 할 수 있습니다. 입력 스캔이 아닌 포인트. 예를 들어, 추가하면여기서 ... 그리고 t1.hundred < t2.hundred, 출력 행 카운트가 줄어 듭니다 결합 노드이지만 입력 스캔도 변경하지 않습니다.
변형 계획을 보는 한 가지 방법은 플래너에게 승자가 생각했던 전략을 사용하여 사용하십시오 각 계획 유형에 대한 플래그 활성화/비활성화. (이것은 원유입니다 도구이지만 유용합니다. 참조 참조섹션 11.3.)
회귀 =# set enable_nestloop = off; 변수를 설정하십시오 회귀 =# 설명 *에서 * Tenk1 T1, Tenk2 T2 여기서 t1.unique1 <50 회귀-# 및 t1.unique2 = t2.unique2; 주목 : 쿼리 계획 : 해시 조인 (비용 = 181.22..564.83 줄 = 49 너비 = 296) - TENK2 T2에서 SEQ 스캔 (비용 = 0.00..333.00 행 = 10000 너비 = 148) - 해시 (비용 = 181.09..181.09 줄 = 49 너비 = 148) - tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..181.09 행 = 49 너비 = 148)
이 계획은 50 개의 흥미로운 행을 추출 할 것을 제안합니다.Tenk1
같은 Olde Index를 사용합니다
스캔하고 메모리 해시 테이블에 보관 한 다음
순차적 스캔Tenk2
,
가능한 일치에 대한 해시 테이블에 대한 조사t1.unique2 = t2.unique2각각Tenk2
튜플. 읽는 스포츠 토토 베트맨Tenk1
해시 테이블을 설정하는 것은 전적으로입니다
해시 조인의 시작 스포츠 토토 베트맨, 우리는 튜플이 없어서
읽기 시작할 때까지TENK2
. 가입의 총 시간 추정치
또한 해시를 조사하기위한 CPU 시간에 대한 무거운 요금도 포함되어 있습니다.
표 10000 회. 그러나 우리는 충전하지 않는다는 점에 유의하십시오
10000 회 181.09; 해시 테이블 설정은 한 번만 수행됩니다
이 계획 유형.
플래너의 정확도를 확인할 수 있습니다. 설명 분석을 사용하여 예상 비용. 이 명령은 실제로 쿼리를 실행 한 다음 실제 런타임을 표시합니다 각 계획 노드 내에 동일한 추정과 함께 축적 평범한 설명이 보여주는 비용. 예를 들어, 우리는 얻을 수 있습니다 다음과 같은 결과 :
회귀 =# 분석 분석 회귀-# 선택 * Tenk1 T1, Tenk2 T2에서 회귀-# 여기서 t1.unique1 <50 및 t1.unique2 = t2.unique2; 주목 : 쿼리 계획 : 중첩 루프 (비용 = 0.00..330.41 행 = 49 너비 = 296) (실제 시간 = 1.31..28.90 행 = 50 루프 = 1) - tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..181.09 행 = 49 너비 = 148) (실제 시간 = 0.69..8.84 줄 = 50 루프 = 1) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.00..3.01 행 = 1 너비 = 148) (실제 시간 = 0.28..0.31 행 = 1 루프 = 50) 총 런타임 : 30.67 MSEC
"실제 시간"값은 실시간 밀리 초에 있지만"스포츠 토토 베트맨"추정치가 표시됩니다 디스크 페치의 임의의 단위; 그래서 그들은 일치하지 않을 것입니다 위로. 주의를 기울여야 할 것은 비율입니다.
일부 쿼리 계획에서는 하위 플랜 노드가 가능합니다. 두 번 이상 실행되었습니다. 예를 들어, 내부 색인 스캔은 다음과 같습니다 위의 중첩 루프 계획에서 외부 튜플 당 1 회 실행됩니다. ~ 안에 그러한 경우,"루프"값 노드의 총 실행 수를보고합니다. 표시된 실제 시간 및 행 값은 실행 중 평균입니다. 이것은 숫자를 그 방식과 비교할 수 있도록하기 위해 스포츠 토토 베트맨 추정치가 표시됩니다. 곱하기"루프"실제로 총 시간을 얻는 값 노드에서 보냈습니다.
the"Total Runtime"분석에 대한 설명에 집행자 시작 및 종료 시간이 포함됩니다 결과 튜플을 처리하는 데 소요되는 시간. 그렇지 않습니다 구문 분석, 재 작성 또는 계획 시간을 포함하십시오. 선택을 위해 쿼리, 총 런타임은 일반적으로 조금 더 클 것입니다. 최상위 계획 노드에 대해보고 된 총 시간보다. 을 위한 쿼리를 삽입, 업데이트 및 삭제하면 총 런타임이 소비 된 시간이 포함되어 있기 때문에 상당히 큽니다 출력 튜플 처리. 이 쿼리에서 시간 최상위 계획 노드는 본질적으로 계산하는 데 소요되는 시간입니다. 새로운 튜플 및/또는 오래된 튜플을 찾지 만 포함하지 않습니다. 변화를하는 데 소요 된 시간.
결과를 설명하는 것은 결과가 아닙니다. 당신이 실제로있는 상황 이외의 상황에 외삽 된 테스트; 예를 들어 장난감 크기의 테이블의 결과는 그럴 수 없습니다 큰 테이블에 적용한다고 가정합니다. 플래너의 비용 추정 선형이 아니므로 다른 계획을 선택할 수 있습니다. 더 크거나 작은 테이블. 극단적 인 예는 테이블에 있습니다 하나의 디스크 페이지만을 차지하면 거의 항상 순차적 스캔 계획 인덱스 사용 가능 여부 그만큼 플래너는 하나의 디스크 페이지를 읽을 것임을 알고 있습니다. 어쨌든 테이블을 처리하므로 지출에 가치가 없습니다. 추가 페이지가 인덱스를보기 위해 읽습니다.