쿼리 성능은 많은 것들의 영향을받을 수 있습니다. 이것들 중 일부 사용자가 조작 할 수 있지만 다른 사람들은 시스템의 기본 설계.
인덱스 생성 및 대량 데이터와 같은 일부 성능 문제 로딩은 다른 곳에 덮여 있습니다. 이 장은에 대해 논의 할 것입니다.설명명령 및 방법을 보여줄 것입니다 쿼리의 세부 사항은 쿼리 계획에 영향을 줄 수 있으므로 전반적으로 성능.
저자 :Tom Lane이 작성하여 이메일로 작성했습니다 2000-03-27.
계획 읽기는 튜토리얼을받을 자격이있는 예술입니다. 하나를 쓸 시간이있었습니다. 여기에 빠르고 더럽습니다 설명.
현재 인용 된 숫자는 다음과 같습니다.
추정 시작 사설 토토 (출력 스캔 전 시간에 소비 된 시간 예를 들어, 정렬 노드에서 정렬을 할 시간).
추정 총 사설 토토 (모든 튜플이 검색된 경우 그들은 --- 한도는 총계를 지불하지 않는 것이 멈출 수 있습니다. 예를 들어 사설 토토).
이 계획 노드에 의한 추정 행 출력.
이에 의해 출력의 추정 평균 너비 (바이트) 노드 계획.
비용은 디스크 페이지의 단위로 측정됩니다. (CPU 노력 추정은 일부를 사용하여 디스크 페이지 장치로 변환됩니다 상당히 임의의 퍼지 인자. 참조SET참조 페이지를 실험하려면 참조 페이지입니다.) 상위 수준 노드의 비용에는 다음에 포함됩니다. 모든 어린이 노드의 비용. 그것을 깨닫는 것도 중요합니다 비용은 플래너/최적화기가 관심을 갖는 것만 반영합니다 에 대한. 특히 비용은 소요 된 시간을 고려하지 않습니다. 결과 튜플을 프론트 엔드로 전송합니다. 진정한 경과 시간에 꽤 지배적 인 요인이지만 플래너 계획을 변경하여 변경할 수 없기 때문에 무시합니다. (모든 올바른 계획은 동일한 튜플 세트를 출력합니다. 우리는 신뢰합니다.)
행 출력은 약간 까다 롭기 때문에not쿼리 --- 예상 선택성을 반영하는 것은 일반적으로 적습니다. 이것에 적용되는 사후 제약 조건 중 마디.
평균 너비는 꽤 가짜입니다. 가변 길이 열의 평균 길이를 알고 있습니다. 나는 미래에 그것을 개선 할 생각이지만 너비가 많이 사용되지 않기 때문에 문제가 될 가치가 있습니다.
여기에 몇 가지 예가 있습니다 (이후 회귀 테스트 데이터베이스 사용 진공 분석 및 거의 7.0 소스) :
regression =# elect * from tenk1; 주목 : 쿼리 계획 : Tenk1의 Seq 스캔 (사설 토토 = 0.00..333.00 행 = 10000 너비 = 148)
이것은 간단한 것만 큼 간단합니다. 그렇다면
선택 *에서 pg_class where relname = 'tenk1';Tenk1에는 233 개의 디스크 페이지와 10000이 있음을 알 수 있습니다. 튜플. 비용은 233 블록으로 추정되며 1.0으로 정의됩니다. 현재 0.01 인 10000 * CPU_TUPLE_COST (tryshow cpu_tuple_cost).
이제 자격 조항을 추가하기 위해 쿼리를 수정합시다 :
regression =# election * tenk1 where where 1 <1000; 주목 : 쿼리 계획 : Tenk1의 Seq 스캔 (사설 토토 = 0.00..358.00 행 = 1000 너비 = 148)출력 행의 추정치가 위치 절. (엄청나게 정확한 추정치는 그 때문입니다 Tenk1은 특히 간단한 경우입니다. 0에서 9999 범위의 100000 개별 값이므로 추정기 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.unique2"절은 그렇지 않습니다 아직 관련이 있으므로 외부 스캔의 행 수에 영향을 미치지 않습니다. 을 위한 내부 스캔, 현재 외부 스캔 튜플의 고유 2 값은 Indexqual과 같은 Indexqual을 생성하기 위해 Inner Indexscan에 연결했습니다. "T2.Unique2 =Constant". 그래서 우리는 얻습니다 예를 들어 우리가 얻는 것과 동일한 내부 스캔 계획과 비용 "Tenk2에서 선택 *을 설명하십시오. 여기서 고유 2 = 42". 루프 노드 그런 다음 비용은 외부 스캔 비용과 하나씩 각 외부 튜플에 대한 내부 스캔의 반복 (100 * 0.53, 여기), 가입 처리를위한 약간의 CPU 시간.
이 예에서 루프의 출력 행 카운트는 두 스캔 행의 산물이지만, 그것은 사실이 아닙니다. 일반, 일반적으로 당신은 그 자리가 언급하는 곳을 가질 수 있기 때문에 두 관계와 So도 가입 지점에서만 적용 할 수 있습니다. 입력 스캔 중 하나입니다. 예를 들어, "Where ... and T1. Hundred <t2.hundred ", 출력 행 카운트가 줄어 듭니다 결합 노드의 경우, 입력 스캔도 변경하지 않습니다.
우리는 플래너가 무시하도록 강요함으로써 변형 계획을 볼 수 있습니다. 우승자라고 생각한 전략 (예쁜 조잡한 도구, 그러나 그것은 우리가 지금 얻은 것입니다) :
회귀 =# 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를 충전하지 않습니다. 해시 테이블 설정은 전용입니다 이 계획 유형에서 한 번 완료되었습니다.