Postgresql 9.2.24 문서 | ||||
---|---|---|---|---|
토토 사이트 순위 : 문서 : 9.2 : 성능 팁 | up | 14 장. 성능 팁 | PostgreSQL : 문서 : 9.2 : 배트맨 토토 사용하는 배트맨 토토 |
PostgreSQLa쿼리 계획각 쿼리마다 수신합니다. 쿼리 구조와 일치하는 올바른 계획을 선택하고 데이터의 속성은 상당히 중요합니다 성능, 따라서 시스템에는 복잡한플래너좋은 계획을 선택하려고합니다. 당신은 할 수 있습니다 사설 토토토토 커뮤니티 : 문서 : 9.2 : 설명플래너가 모든 쿼리에 대해 생성하는 쿼리 계획. 계획 읽기 is an art that requires some experience to master, but this 섹션은 기본 사항을 다루려고 시도합니다.
이 섹션의 예는 회귀 테스트에서 가져옵니다. a를 수행 한 후 데이터베이스진공 분석, 9.2 개발 소스 사용. 비슷하게 얻을 수 있어야합니다 예제를 직접 시도하지만 추정 된 결과 비용과 행 횟수는이기 때문에 약간 달라질 수 있습니다.분석의 통계는 랜덤 샘플입니다 정확한 것보다, 비용은 본질적으로 다소 다소 있기 때문입니다 플랫폼 의존적.
예제 사설 토토사설 토토의 기본값"텍스트"출력 형식은 작습니다 인간이 읽는 편리합니다. 피드를 원한다면사설 토토'의 출력은 더 많은 프로그램에 대한 프로그램에 출력합니다 분석적으로, 기계 판독 가능한 출력 중 하나를 사용해야합니다 대신 형식 (XML, JSON 또는 YAML).
쿼리 계획의 구조는의 나무입니다.계획 노드. 하단 레벨의 노드 트리는 스캔 노드입니다. 테이블에서 원시 행을 반환합니다. 거기 다른 테이블 액세스를위한 다른 유형의 스캔 노드입니다. 방법 : 순차적 스캔, 인덱스 스캔 및 비트 맵 인덱스 스캔. 와 같은 비 테이블 행 소스도 있습니다.값조항 및 세트 퇴행 함수From, 자체 스캔 노드가 있습니다 유형. 쿼리에 결합, 집계, 정렬 또는 또는 원시 행에 대한 다른 작업이 추가됩니다. 스캔 노드 위의 노드는 이러한 작업을 수행합니다. 다시, 일반적으로이를 수행 할 수있는 가능한 방법이 있습니다. 작업이 있으므로 다른 노드 유형도 여기에 나타날 수 있습니다. 그만큼 출력사설 토토한 줄이 있습니다 기본 노드 유형 플러스를 표시하는 플랜 트리의 각 노드 비용은 플래너가 실행을 위해 만든 것으로 추정합니다. 그 계획 노드. 추가 선이 나타날 수 있습니다 노드의 요약 라인, 추가 속성을 표시합니다. 마디. 첫 번째 줄 (최상위 요약 라인 노드)는 계획에 대한 총 실행 비용이 추정됩니다. 그것 플래너가 최소화하려는이 숫자입니다.
여기에 사소한 예가 있습니다. 보이는 것 같습니다 :
사설 토토 *에서 10에서 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
이 쿼리가 없기 때문에여기서절, 테이블의 모든 행을 스캔해야하므로 플래너 간단한 순차적 스캔 계획을 사용하기로 선택했습니다. 숫자 괄호 안에 인용 된 것은 (왼쪽에서 오른쪽으로) :
예상 시작 비용. 지금은 소비 된 시간입니다 출력 단계가 시작되기 전에 (예 : 시간) 정렬 노드에서 정렬.
총 비용. 이것은 가정에 명시되어 있습니다 계획 노드가 완료되도록 실행됩니다. 사용 가능한 행이 검색됩니다. 실제로 노드의 부모 노드는 사용 가능한 모든 행을 읽지 않는 것이 멈출 수 있습니다 ( 그만큼Limit아래 예제).
이 계획 노드에 의한 추정 행 출력 수. 다시, 노드는 완료로 실행되는 것으로 가정합니다.
이 계획 노드에 의해 출력의 추정 평균 폭 (바이트).
비용은 플래너의 비용 매개 변수 (참조섹션 18.7.2). 전통적인 관행은 비용을 측정하는 것입니다 디스크 페이지의 단위; 즉,SEQ_PAGE_COST전통적으로 설정되었습니다1.0및 다른 비용 매개 변수는 그것에 대해 설정됩니다. 예제 이 섹션은 기본 비용 매개 변수로 실행됩니다.
상위 수준의 비용이 노드에는 모든 하위 노드의 비용이 포함됩니다. 그것은 또한입니다 비용은 플래너는 관심을 갖습니다. 특히 비용은 그렇지 않습니다 결과 행을 클라이언트에게 전송하는 데 소요되는 시간을 고려하십시오. 실제 경과 시간에서 중요한 요소가 될 수 있습니다. 그러나 플래너는 그것을 바꿀 수 없기 때문에 그것을 무시합니다. 계획 변경. (모든 정확한 계획은 같은 행을 출력합니다 세트, 우리는 신뢰합니다.)
the행값은 약간 까다 롭습니다 처리 또는 스캔 한 행이 아니기 때문에 계획 노드, 오히려 노드에 의해 방출되는 숫자. 이것 필터링의 결과로 스캔 한 숫자보다 종종 어떤여기서-Clase 조건 노드에 적용되고 있습니다. 이상적으로는 최상위 행입니다 추정치는 실제로 반환 된 행의 수를 근사합니다. 쿼리에 의해 업데이트되거나 삭제되었습니다.
예제로 돌아 가기 :
사설 토토 *에서 10에서 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
이 숫자는 매우 간단하게 파생됩니다. 당신이 하다:
relname = 'tenk1'; pg_class에서 reelpages, reltuples를 선택하십시오.
당신은 그것을 알게 될 것입니다Tenk1
358 디스크 페이지 및 10000 행. 예상 비용은 계산됩니다
AS (디스크 페이지 읽기 *SEQ_PAGE_COST)
+ (줄 스캔 *CPU_TUPLE_COST).
기본적으로seq_page_cost1.0이고CPU_TUPLE_COST는 0.01입니다
예상 비용은 (358 * 1.0) + (10000 * 0.01) = 458입니다.
이제 query를 수정하여 A여기서조건 :
SELECT * SELECT *에서 TENK1 where 1 <7000; 쿼리 계획 ------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 7001 너비 = 244) 필터 : (고유 한 <7000)
사설 토토출력 표시여기서조항이 적용 중입니다 A로"필터"첨부 된 조건 SEQ 스캔 계획 노드. 이것은 계획 노드가 점검한다는 것을 의미합니다 스캔하는 각 행의 조건 및 출력 만 출력합니다. 상태를 통과합니다. 출력 행의 추정치가 있습니다 때문에 감소여기서절. 그러나 스캔은 여전히 10000 행을 모두 방문해야하므로 비용은 감소하지 않았습니다. 실제로 그것은 조금 올라 갔다 (by 10000 *cpu_operator_cost, 정확하게) 추가 CPU 시간을 반영하려면여기서조건.
이 쿼리가 선택한 실제 행 수는 7000입니다. 하지만행추정은 전용입니다 근사치를 내다. 이 실험을 복제하려고하면됩니다 아마도 약간 다른 견적을 얻을 수 있습니다. 또한 가능합니다 각 후 변경분석명령, 통계가 생성 되었기 때문에분석는 무작위 샘플에서 가져옵니다 테이블.
이제 조건을보다 제한적으로 만들자 :
사설 토토을 선택하십시오 * tenk1에서 where ightor1 <100; 쿼리 계획 ---------------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 5.03..229.17 행 = 101 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.01 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100)
여기서 플래너는 2 단계 계획을 사용하기로 결정했습니다. 아동 계획 노드는 줄의 위치를 찾기 위해 색인을 방문합니다. 인덱스 조건과 일치 한 다음 상단 계획 노드 일치 실제로 테이블 자체에서 그 행을 가져옵니다. 가져 오기 개별 행은 읽는 것보다 훨씬 비쌉니다 순차적으로, 그러나 테이블의 모든 페이지에 방문하기 위해서는 여전히 순차적 스캔보다 저렴합니다. (두 계획 수준을 사용하는 이유는 상위 계획이 노드는 인덱스로 식별 된 행 위치를 정렬합니다. 읽기 전에 물리적 순서, 비용을 최소화합니다. 별도의 페치. 그만큼"비트 맵"노드 이름에 언급 된 것은 정렬.)
이제 다른 조건을 추가합시다여기서절 :
tenk1에서 선택 *을 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 5.01..229.40 행 = 1 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) 필터 : (stringu1 = 'xxx':: name) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.01 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100)
추가 조건StringU1 = '트리플 엑스'출력 행 카운트 추정치는 감소하지만 우리는 여전히 같은 행 세트를 방문해야하기 때문에 비용.StringU1절은 할 수 없습니다 이 인덱스가 켜져 있기 때문에 인덱스 조건으로 적용됩니다. 그만큼고유 한열. 대신입니다 인덱스에 의해 검색된 행의 필터로 적용됩니다. 따라서 이 추가 반영을 위해 비용은 실제로 약간 증가했습니다. 점검.
경우에 따라 플래너는 a를 선호합니다."간단한"색인 스캔 계획 :
onecior1 = 42에서 10에서 선택 *을 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------------------- Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..8.27 행 = 1 너비 = 244) 색인 조건 : (고유 1 = 42)
이 유형의 계획에서 테이블 행이 색인에 가져옵니다. 주문, 읽는 것이 더 비싸지 만 거기에 행 위치를 분류하는 데 추가 비용이 너무 적을 정도로 그만한 가치가 없습니다. 쿼리에 대한이 계획 유형을 가장 자주 볼 수 있습니다 그것은 단 하나의 행을 가져옵니다. 또한 종종 쿼리에 사설 토토됩니다주문 by조건 추가 정렬 단계가 없기 때문에 인덱스 순서와 일치합니다. 만족해야 할 필요성주문 by.
참조 된 여러 열에 인덱스가있는 경우여기서, 플래너는 사용하도록 선택할 수 있습니다 인덱스의 및 또는 또는 조합 :
Tenk1에서 선택 *을 선택하십시오. 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------. Tenk1의 비트 맵 힙 스캔 (비용 = 25.01..60.14 행 = 10 너비 = 244) COND를 다시 확인하십시오 : ((고유 1 <100) 및 (고유 2 9000)) - bitmapand (비용 = 25.01..25.01 행 = 10 너비 = 0) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.01 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100) - tenk1_unique2의 비트 맵 인덱스 스캔 (비용 = 0.00..19.74 행 = 999 너비 = 0) 색인 조건 : (고유 2 9000)
그러나 두 인덱스를 모두 방문해야하므로 그렇지 않습니다 단 하나의 색인을 사용하고 치료하는 것과 비교하여 반드시 승리 필터로서 다른 조건. 당신이 범위를 변화시키는 경우 관련된 계획이 그에 따라 변경되는 것을 볼 수 있습니다.
다음은의 효과를 보여주는 예입니다.Limit:
10 <100 및 고유 2 9000 한계에서 10에서 선택 *을 선택하십시오. 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------. 한계 (비용 = 0.00..14.25 행 = 2 너비 = 244) - tenk1에서 tenk1_unique2를 사용한 인덱스 스캔 (비용 = 0.00..71.23 행 = 10 너비 = 244) 색인 조건 : (고유 2 9000) 필터 : (고유 한 <100)
23098_23148Limit모든 행이 필요하지는 않습니다 검색되었고 플래너는해야 할 일에 대한 마음이 바뀌 었습니다. 인덱스 스캔 노드의 총 비용 및 행 수에 주목하십시오. 마치 완료로 실행되는 것처럼 보입니다. 그러나 한계 노드 중 5 분의 1을 검색 한 후 노드가 중지 될 것으로 예상됩니다. 줄, 총 비용은 5 분의 1에 불과합니다. 쿼리의 실제 추정 비용. 이 계획은 선호됩니다 한계이므로 이전 계획에 한계 노드 추가 비트 맵 스캔의 시작 비용을 지불하지 않아도됩니다. 총 비용은 25 대 이상의 유닛이 될 것입니다. 접근하다.
우리가 있었던 열을 사설 토토하여 두 개의 테이블을 결합 해 보겠습니다. 토론 :
선택을 사설 토토하십시오 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <10 및 t1.unique2 = t2.unique2; 쿼리 계획 ----------------------------------------------------------------------------------------------------- 중첩 루프 (비용 = 4.33..118.25 행 = 10 너비 = 488) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.33..39.44 행 = 10 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <10) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.33 행 = 10 너비 = 0) 색인 조건 : (고유 1 <10) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.00..7.87 행 = 1 너비 = 244) 색인 조건 : (고유 2 = t1.unique2)
이 계획에는 두 개의 테이블이있는 중첩 루프 조인 노드가 있습니다. 입력 또는 어린이로 스캔합니다. 노드의 들여 쓰기 요약 라인은 계획 트리 구조를 반영합니다. 가입 첫째, 또는"외부", 자식은 비트 맵입니다 우리가 전에 본 것과 유사하게 스캔하십시오. 비용과 행 계수가 있습니다 우리가 얻은 것과 마찬가지선택 ... 어디에 고유 한 <10우리가 신청하고 있기 때문에여기서절고유 한 < 10해당 노드에서. 그만큼t1.unique2 = t2.uique2절은 아직 관련이 없으므로 그렇지 않습니다 외부 스캔의 행 수에 영향을 미칩니다. 중첩 루프 조인 노드는 두 번째로 실행됩니다."내부"외부 어린이로부터 얻은 각 행에 대해 한 번 자식. 열 현재 외부 행의 값은 내부에 연결할 수 있습니다. 주사; 여기,t1.unique2값에서 외부 행을 사설 토토할 수 있으므로 계획과 비용이 유사합니다. 우리가 단순한 것을 위해 위에서 본 것에선택 ... 여기서 t2.unique2 =Constant케이스. (예상 비용 실제로 위에서 본 것보다 조금 낮습니다. 반복 된 색인 중에 발생할 것으로 예상되는 캐싱 스캔T2.) 루프 비용 그런 다음 노드는 외부 스캔 비용을 기준으로 설정됩니다. 각 외부 행에 대한 내부 스캔의 반복 (10 * 7.87, 여기), 가입 처리를위한 약간의 CPU 시간.
이 예에서 조인의 출력 행 카운트는 다음과 같습니다. 두 스캔 행의 제품은 사실이 아니지만 사실이 아닙니다. 추가가있을 수 있기 때문에 모든 경우에여기서테이블 등을 모두 언급하는 조항 입력이 아닌 조인 지점에서만 적용 할 수 있습니다. 주사. 예를 들어, 우리가 하나 더 추가하면 :
선택 선택 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <10 및 t1.unique2 = t2.unique2 및 t1.hundred <t2.hundred; 쿼리 계획 ----------------------------------------------------------------------------------------------------- 중첩 루프 (비용 = 4.33..118.28 행 = 3 너비 = 488) 가입 필터 : (T1. Hundred <t2.hundred) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.33..39.44 행 = 10 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <10) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.33 행 = 10 너비 = 0) 색인 조건 : (고유 1 <10) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.00..7.87 행 = 1 너비 = 244) 색인 조건 : (고유 2 = t1.unique2)
추가 조건t1.hundred < t2.hundred테스트 할 수 없습니다Tenk2_unique2색인이므로 조인시에 적용됩니다 마디. 이렇게하면 조인의 추정 출력 행 카운트가 줄어 듭니다. 노드이지만 입력 스캔을 변경하지 않습니다.
OUTER 조인을 처리 할 때는 계획 노드에 가입 할 수 있습니다. 둘 다"필터 가입"및 일반"필터"첨부 된 조건. 가입하다 필터 조건은 외부 조인에서 나옵니다on조항, 그래서 조인 필터에 실패하는 행입니다 상태는 여전히 널 확장 행로 방출 될 수 있습니다. 그러나 a 일반 필터 조건은 외부 결합 규칙에 따라 적용됩니다 그래서 무조건 행을 제거하는 역할을합니다. 내부에 가입 이러한 유형의 의미 적 차이는 없습니다 필터.
쿼리의 선택성을 약간 변경하면 매우 다른 조인 계획 :
선택 선택 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2; 쿼리 계획 ------------------------------------------------------------------------------------------------------------ 해시 조인 (비용 = 230.43..713.94 행 = 101 너비 = 488) 해시 조건 : (T2.Unique2 = t1.unique2) - TENK2 T2의 SEQ 스캔 (비용 = 0.00..445.00 행 = 10000 너비 = 244) - 해시 (비용 = 229.17..229.17 행 = 101 너비 = 244) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 5.03..229.17 행 = 101 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.01 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100)
여기, 플래너는 해시 조인을 사용하기로 선택했습니다. 한 테이블 행은 메모리 해시 테이블에 입력됩니다. 그 후 다른 테이블이 스캔되고 해시 테이블은 각 행과 일치하는 것으로 조사되었습니다. 다시 들여 쓰기를 다시 주목하십시오 계획 구조를 반영합니다 : 비트 맵 스캔Tenk1해시 노드에 대한 입력입니다 해시 테이블을 구성합니다. 그런 다음 해시로 돌아갑니다 노드에 가입하여 외부 아동 계획에서 행을 읽고 각각에 대한 해시 테이블을 검색합니다.
다른 가능한 가입 유형은 병합 조인, 그림입니다. 여기:
선택 선택 * TENK1 T1, ONEK T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2; 쿼리 계획 ------------------------------------------------------------------------------------------------------------ 합병 조인 (비용 = 197.83..267.93 행 = 10 너비 = 488) 병합 Cond : (T1.unique2 = T2.Unique2) - tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔 (비용 = 0.00..656.25 행 = 101 너비 = 244) 필터 : (고유 한 <100) - 정렬 (비용 = 197.83..200.33 행 = 1000 너비 = 244) 정렬 키 : T2.Unique2 - Onek t2의 SEQ 스캔 (비용 = 0.00..148.00 행 = 1000 너비 = 244)
합병 결합은 결합에 입력 데이터를 정렬해야합니다. 열쇠. 이 계획에서Tenk1데이터는입니다 인덱스 스캔을 사설 토토하여 올바른 행을 방문하여 정렬 주문하지만 순차적 스캔 및 정렬이 선호됩니다.ONEK, 더 많은 행이 있기 때문입니다 그 테이블에 방문합니다. (순차적 스캔 및 소트 많은 행을 정렬하기위한 인덱스 스캔을 자주 이길 수 있습니다. 인덱스가 요구하는 비 순차 디스크 액세스 주사.)
변형 계획을 보는 한 가지 방법은 플래너에게 가장 저렴한 전략을 무시하십시오 에 사설 토토 된 플래그 활성화/비활성화섹션 18.7.1. (이것은 조잡한 도구이지만 유용합니다. 참조PostgreSQL : 문서 : 9.2 : 명시 적 조인 조항으로 토토 커뮤니티 제어.) 예를 들어, 우리가 순차적 인 스캔과 스토프가 최고라고 확신하지 못했다면 표를 다루는 방법ONEK이전의 예, 우리는 시도 할 수 있습니다
set enable_sort = off; 선택 * * TENK1 T1, ONEK T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2; 쿼리 계획 ------------------------------------------------------------------------------------------------------------ 합병 조인 (비용 = 0.00..292.36 행 = 10 너비 = 488) 병합 Cond : (T1.unique2 = T2.Unique2) - tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔 (비용 = 0.00..656.25 행 = 101 너비 = 244) 필터 : (고유 한 <100) - Onek t2에서 Onek_unique2를 사용한 색인 스캔 (비용 = 0.00..224.76 행 = 1000 너비 = 244)
플래너가 정렬을 생각한다는 것을 보여줍니다ONEKBy Index-Scanning은 약 12% 더 높습니다 순차적 스캔 및 소트보다 비싸다. 물론 다음 질문은 그것이 옳은지 여부입니다. 우리는 조사 할 수 있습니다 그 사설 토토분석, AS 아래 논의.
플래너의 정확도를 확인할 수 있습니다. 사용하여 추정치사설 토토's분석옵션. 이 옵션으로사설 토토실제로 쿼리를 실행합니다. 그런 다음 True Row Counts 및 True Run Time을 표시합니다. 각 계획 노드 내에 동일하게 누적됩니다 평범한 것으로 추정사설 토토쇼. 예를 들어, 우리는 다음과 같은 결과를 얻을 수 있습니다.
선택 선택 * * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <10 및 t1.unique2 = t2.unique2; 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. 중첩 루프 (비용 = 4.33..118.25 행 = 10 너비 = 488) (실제 시간 = 0.370..1.126 행 = 10 루프 = 1) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.33..39.44 행 = 10 너비 = 244) (실제 시간 = 0.254..380 행 = 10 루프 = 1) COND를 다시 확인하십시오 : (고유 1 <10) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.33 행 = 10 너비 = 0) (실제 시간 = 0.164..0.164 행 = 10 루프 = 1) 색인 조건 : (고유 1 <10) - tenk2 t2에서 tenk2_unique2를 사용한 색인 스캔 (비용 = 0.00..7.87 행 = 1 너비 = 244) (실제 시간 = 0.041..0.048 행 = 1 루프 = 10) 색인 조건 : (고유 2 = t1.unique2) 총 런타임 : 2.414 ms
"실제 시간"값은 실시간 밀리 초에 있지만비용추정치는 임의 단위로 표현됩니다. 그래서 그들은 일치하지 않을 것입니다. 일반적으로 가장 큰 것 찾는 것이 중요합니다. 추정 행 카운트가 현실에 합리적으로 가깝습니다. 이 예에서는 추정치가있었습니다 모두 죽었지 만 실제로는 매우 드문 일입니다.
일부 쿼리 계획에서는 하위 비행 노드가 가능합니다. 두 번 이상 실행되었습니다. 예를 들어, 내부 색인 스캔이됩니다 위의 중첩 루프 계획에서 외부 행당 한 번 실행됩니다. 그러한 경우루프값 보고서 노드의 총 실행 수와 실제 시간 표시된 행 값은 실행 중 평균입니다. 이것은 완료되었습니다 숫자를 비용과 비교할 수 있도록 추정치가 표시됩니다. 곱하기루프실제로 총 시간을 실제로 사설 토토하는 값 노드에서. 위의 예에서는 총 0.480을 보냈습니다. 인덱스 스캔을 실행하는 밀리 초Tenk2.
경우에 따라분석쇼 계획 노드 실행을 넘어서 추가 실행 통계 시간과 행 계산. 예를 들어 정렬 및 해시 노드가 제공합니다 추가 정보 :
분석 선택 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2 t1.fiveThous의 순서; 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------------------------- 정렬 (비용 = 717.30..717.56 행 = 101 너비 = 488) (실제 시간 = 104.950..105.327 행 = 100 루프 = 1) 정렬 키 : T1. 피브 러스 정렬 방법 : QuickSort 메모리 : 68KB - 해시 조인 해시 조건 : (T2.Unique2 = t1.unique2) - TENK2 T2의 SEQ 스캔 (비용 = 0.00..445.00 행 = 10000 너비 = 244) (실제 시간 = 0.046..46.219 행 = 100000 루프 = 1) - 해시 (비용 = 229.17..229.17 행 = 101 너비 = 244) (실제 시간 = 3.184..3.184 줄 = 100 루프 = 1) 버킷 : 1024 배치 : 1 메모리 사용량 : 27KB - tenk1 t1의 비트 맵 힙 스캔 (비용 = 5.03..229.17 행 = 101 너비 = 244) (실제 시간 = 0.612..1.959 행 = 100 루프 = 1) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.01 행 = 101 너비 = 0) (실제 시간 = 0.390..0.390 행 = 100 루프 = 1) 색인 조건 : (고유 1 <100) 총 런타임 : 107.392 ms
정렬 노드는 사설 토토 된 정렬 방법을 보여줍니다 (특히, 종류가 메모리 인 또는 온 디스크인지 여부와 금액 메모리 또는 디스크 공간이 필요합니다. 해시 노드는 수를 보여줍니다 해시 버킷 및 배치뿐만 아니라 최고 양의 메모리 해시 테이블에 사설 토토됩니다. (배치 수가 하나를 초과하는 경우 디스크 공간 사설 토토이 포함되지만 표시.)
다른 유형의 추가 정보는 행의 수입니다. 필터 조건으로 제거 :
10 <7에서 10 <7; 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 7000 너비 = 244) (실제 시간 = 0.111..59.249 행 = 7000 루프 = 1) 필터 : (10 <7) 필터로 제거 된 행 : 3000 총 런타임 : 85.340ms
이 카운트는 필터에 특히 유용 할 수 있습니다 조인 노드에서 적용되는 조건. 그만큼"행 제거됨"줄은 적어도 스캔 한 경우에만 나타납니다 결합 노드의 경우 행 또는 잠재적 조인 쌍은 필터 조건에 의해 거부 됨.
필터 조건과 유사한 경우"Lossy"인덱스 스캔. 예를 들어, 이것을 고려하십시오 특정 요점을 포함하는 다각형 검색 :
polygon_tbl에서 선택 * 선택 * f1 @ 다각형 '(0.5,2.0)'; 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. polygon_tbl에서의 seq 스캔 (cost = 0.00..1.05 줄 = 1 너비 = 32) (실제 시간 = 0.251..0.251 행 = 0 루프 = 1) 필터 : (f1 @ '((0.5,2))':: 다각형) 필터에 의해 제거 된 행 : 4 총 런타임 : 0.517ms
플래너는이 샘플 테이블을 (매우 정확하게) 생각합니다 색인 스캔으로 귀찮게하기에는 너무 작아서 평원이 있습니다. 모든 행이 거부 된 순차적 스캔 필터 상태. 그러나 인덱스 스캔을 사용하도록 강요하면 우리는 보다:
ENABLE_SEQSCAN을 OFF로 설정합니다. polygon_tbl에서 선택 * 선택 *을 사설 토토하십시오. 여기서 f1 @ 다각형 '(0.5,2.0)'; 쿼리 계획 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. polygon_tbl에서 gpolygonind를 사용한 인덱스 스캔 (비용 = 0.00..8.27 행 = 1 너비 = 32) (실제 시간 = 0.293..0.293 행 = 0 루프 = 1) 색인 조건 : (f1 @ '((0.5,2))':: 다각형) 인덱스 재확인으로 제거 된 행 : 1 총 런타임 : 1.054 ms
여기서 우리는 인덱스가 1 개의 후보 행을 반환했음을 알 수 있습니다. 그런 다음 인덱스 조건의 재확인으로 거부되었습니다. 이것은 GIST 지수가이기 때문에 발생합니다."Lossy"다각형 격리 테스트 : IT 실제로 겹치는 다각형으로 행을 반환합니다 목표, 그리고 우리는 정확한 격리 테스트를 수행해야합니다. 그 줄.
사설 토토a버퍼분석더 많은 런타임 통계를 얻으려면 :
사설 토토 (분석, 버퍼) * 선택 * 10 <100 및 고유 2 9000; 쿼리 계획 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. Tenk1의 비트 맵 힙 스캔 (비용 = 25.07....60.23 행 = 10 너비 = 244) (실제 시간 = 3.069..3.213 행 = 10 루프 = 1) COND를 다시 확인하십시오 : ((고유 1 <100) 및 (고유 2 9000)) 버퍼 : 공유 적중 = 16 - bitmapand (비용 = 25.07..25.07 행 = 10 너비 = 0) (실제 시간 = 2.967..2.967 행 = 0 루프 = 1) 버퍼 : 공유 적중 = 7 - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.02 행 = 102 너비 = 0) (실제 시간 = 0.732..0.732 행 = 200 루프 = 1) 색인 조건 : (고유 1 <100) 버퍼 : 공유 적중 = 2 - tenk1_unique2의 비트 맵 인덱스 스캔 (비용 = 0.00..19.80 행 = 1007 너비 = 0) (실제 시간 = 2.015..2.015 행 = 1009 루프 = 1) 색인 조건 : (고유 2 9000) 버퍼 : 공유 적중 = 5 총 런타임 : 3.917ms
버퍼쿼리의 가장 많은 부분을 식별하는 데 도움이 I/O- 집약적.
이를 명심하십시오사설 토토 분석실제로 쿼리를 실행하면 부작용이 있습니다 쿼리가 어떤 결과를 든 결과에도 불구하고 평소와 같이 발생합니다. 출력은 인쇄에 찬성하여 폐기됩니다사설 토토데이터. 분석하려면 a 데이터 수정 쿼리 테이블을 변경하지 않고 롤링 할 수 있습니다 예를 들어 다음과 같은 명령을 거슬러 올라갑니다.
시작; Analyze Update Tenk1 세트 백 = 백 + 1 여기서 고유 1 <100; 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------------- Tenk1에 대한 업데이트 (비용 = 5.03..229.42 행 = 101 너비 = 250) (실제 시간 = 81.055..81.055 행 = 0 루프 = 1) - tenk1의 비트 맵 힙 스캔 (비용 = 5.03..229.42 행 = 101 너비 = 250) (실제 시간 = 0.766..3.396 행 = 100 루프 = 1) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.01 행 = 101 너비 = 0) (실제 시간 = 0.461..0.461 행 = 100 루프 = 1) 색인 조건 : (고유 1 <100) 총 런타임 : 81.922ms 롤백;
이 예에서 볼 수 있듯이 쿼리가 A an 일 때삽입, 업데이트또는삭제명령, 실제 작업 테이블 변경을 적용하는 것은 최상위 삽입으로 수행됩니다. 계획 노드를 업데이트하거나 삭제합니다. 이 아래의 계획 노드 노드는 이전 행을 찾거나 컴퓨팅을 수행하는 작업을 수행합니다. 새로운 데이터. 그래서 우리는 같은 종류의 비트 맵 테이블을 볼 수 있습니다. 우리가 이미 본 스캔과 그 출력은 업데이트에 공급됩니다. 업데이트 된 행을 저장하는 노드. 주목할 가치가 있습니다 데이터 수정 노드는 상당한 양을 섭취 할 수 있지만 런타임의 플래너는 현재 비용에 아무것도 추가하지 않습니다. 그 작업을 사설 토토하는 것으로 추정됩니다. 그것은 일하기 때문입니다 완료해야 할 모든 올바른 쿼리 계획에 대해 동일하므로 계획 결정에 영향을 미칩니다.
the총 런타임표시분석집행자 포함 스타트 업 및 종료 시간뿐만 아니라 실행 시간 발사 된 트리거이지만 구문 분석은 포함되지 않습니다. 재 작성 또는 계획 시간. 실행하는 데 소요되는 시간전트리거가 시간에 포함되어 있습니다 관련 삽입, 업데이트 또는 삭제 노드; 그러나 시간을 보낸 시간 실행이후트리거는 아닙니다 이기 때문에 계산이후트리거 전체 계획이 완료된 후 해고됩니다. 총 시간 각 방아쇠에 소비 (하나전또는이후)도 별도로 표시됩니다. 지연된 제약 조건 트리거는 실행되지 않습니다 거래가 끝날 때까지 전혀 표시되지 않습니다.분석.
실행 시간을 측정하는 두 가지 중요한 방법이 있습니다.
에 의해분석에서 벗어날 수 있습니다
동일한 쿼리의 일반 실행. 첫째, 출력 행이 없기 때문에
클라이언트, 네트워크 전송 비용 및 I/O에게 제공됩니다.
전환 비용은 포함되지 않습니다. 둘째, 측정
오버 헤드 추가분석 사설 토토can
특히 느린 기계에서 중요합니다gettimeofday ()
운영 시스템 호출. 너
를 사설 토토할 수 있습니다.토토 : 문서 : 9.2 :측정하는 도구
시스템의 타이밍 오버 헤드.
사설 토토결과는 아니어야합니다 당신이있는 것과 훨씬 다른 상황에 외삽 된 실제로 테스트; 예를 들어 장난감 크기의 테이블의 결과 큰 테이블에 적용되는 것으로 가정 할 수 없습니다. 플래너의 비용 추정치는 선형이 아니므로 다른 것을 선택할 수 있습니다. 더 크거나 작은 테이블을 계획하십시오. 극단적 인 예는 그 것입니다 하나의 디스크 페이지만을 차지하는 테이블에서 거의 인덱스 사용 가능 여부에 관계없이 항상 순차적 스캔 계획을 받으십시오. 아니면 아니에요. 플래너는 하나의 디스크를 가져갈 것임을 알고 있습니다. 페이지를 읽으려면 테이블을 처리하여 어떤 경우에도 값이 없습니다. 추가 페이지를 소비하면 인덱스를보기 위해 읽습니다. (우리는 보았다 이것은에서 일어나고 있습니다.polygon_tbl위의 예.)
실제 및 추정 값이있는 경우가 있습니다. 잘 어울리지는 않지만 실제로 잘못된 것은 없습니다. 그러한 사례 중 하나 계획 노드 실행이 a에 의해 짧게 중지 될 때 발생합니다.Limit또는 유사한 효과. 예를 들어, 에서Limit이전에 사설 토토한 쿼리,
Tenk1에서 선택 * 선택 *을 사설 토토하십시오. 쿼리 계획 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. 한계 (비용 = 0.00..14.25 행 = 2 너비 = 244) (실제 시간 = 1.652..2.293 행 = 2 루프 = 1) - tenk1에서 tenk1_unique2를 사용한 색인 스캔 (비용 = 0.00..71.23 행 = 10 너비 = 244) (실제 시간 = 1.631..2.259 행 = 2 루프 = 1) 색인 조건 : (고유 2 9000) 필터 : (고유 한 <100) 필터로 제거 된 행 : 287 총 런타임 : 2.857 ms
인덱스 스캔 노드의 추정 비용 및 행 계산은 다음과 같습니다. 마치 완료로 실행되는 것처럼 보입니다. 그러나 실제로 제한 노드가 2 개를 얻은 후 행 요청 중지를 중지했습니다. 실제 행 카운트는 2에 불과하고 런타임은 비용 추정치가 제안합니다. 이것은 추정 오류가 아닙니다. 추정 및 실제 값이 표시.
합병 결합에는 혼동 될 수있는 측정 아티팩트도 있습니다 부적절한. 병합 조인은 하나의 입력을 읽지 않습니다. 하나의 다른 입력과 다음 키 값을 소진했습니다. 입력은 다른 입력의 마지막 키 값보다 큽니다. ~에 그러한 경우 더 이상 일치 할 수 없으므로 스캔 할 필요가 없습니다. 나머지 첫 번째 입력. 이로 인해 모든 것을 읽지 않습니다 한 어린이,와 같은 결과가Limit. 또한 외부 (첫 번째) 자식에 포함 된 경우 중복 키 값이있는 행, 내부 (두 번째) 자식은 행의 부분에 대해 백업 및 철회 그 주요 가치.분석카운트 마치 마치 마치 같은 내부 행의 반복적 인 배출 실제 추가 행. 외부 복제물이 많으면 내부 아동 계획 노드에 대한 실제 행 카운트가 실제로 행하는 행 수보다 훨씬 큽니다. 내면의 관계에서.
비트 맵 및 비트 맵 노드는 항상 실제 행을보고합니다 구현 제한으로 인해 0으로 계산됩니다.