Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
윈 토토 : 문서 : 9.3 : 성능 팁 | up | 14 장. 성능 팁 | PostgreSQL : 문서 : 9.3 : 무지개 토토 사용하는 무지개 토토 |
PostgreSQLa쿼리 계획각 쿼리마다 수신합니다. 선택 쿼리 구조와 속성에 맞는 올바른 계획 데이터는 우수한 성능에 절대적으로 중요하므로 시스템 복잡한 포함플래너좋은 계획을 선택하십시오. 를 젠 토토할 수 있습니다.젠 토토어떤 쿼리 계획을 확인하려면 명령 플래너는 모든 쿼리를 만듭니다. 계획 읽기는 필요한 예술입니다 마스터 한 경험이 있지만이 섹션은 기초.
이 섹션의 예는 회귀 테스트에서 가져옵니다. a를 수행 한 후 데이터베이스진공 분석, 9.3 개발 소스 사용. 비슷하게 얻을 수 있어야합니다 결과를 직접 시도하지만 추정 비용 그리고 행 카운트는이기 때문에 약간 변할 수 있습니다.분석의 통계는보다는 랜덤 샘플입니다 정확하고 비용은 본질적으로 다소 다소 있기 때문입니다 플랫폼 의존적.
예제 젠 토토젠 토토의 기본값"텍스트"출력 형식은 작습니다 인간이 읽는 편리합니다. 피드를 원한다면젠 토토의 추가 분석을위한 프로그램에 대한 출력, 머신 읽기 가능한 출력 형식 중 하나를 사용해야합니다 (XML, JSON 또는 YAML) 대신.
쿼리 계획의 구조는의 나무입니다.계획 노드. 트리의 하단 레벨에있는 노드 스캔 노드입니다. 테이블에서 원시 행을 반환합니다. 거기 있습니다 다른 테이블 액세스 방법에 대한 다른 유형의 스캔 노드 : 순차적 스캔, 인덱스 스캔 및 비트 맵 인덱스 스캔. 거기 있습니다 또한와 같은 비 테이블 행 소스도값조항 및 세트 퇴행 함수From, 자체 스캔 노드 유형이 있습니다. 만약 쿼리에는 결합, 집계, 정렬 또는 기타 작업이 필요합니다 원시 행에는 스캔 위에 추가 노드가 있습니다. 이러한 작업을 수행하는 노드. 다시, 보통 더 많은 것이 있습니다 이러한 작업을 수행하는 하나의 가능한 방법보다 다른 노드 유형도 여기에 나타날 수 있습니다. 의 출력젠 토토플랜 트리의 각 노드마다 하나의 줄이 있습니다. 기본 노드 유형을 표시하고 비용은 해당 계획 노드의 실행을위한 플래너. 추가 라인 노드의 요약 라인에서 들여 쓰기가 표시되어 표시됩니다. 노드의 추가 속성. 첫 번째 줄 (요약 최상위 노드의 라인)는 총 실행 비용이 추정됩니다. 계획을 위해; 플래너가 원하는 것은이 숫자입니다 최소화.
출력이 어떻게 보이는지 보여주기 위해 사소한 예가 있습니다. 좋다:
젠 토토 *에서 10에서 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
이 쿼리가 없기 때문에여기서절, 테이블의 모든 행을 스캔해야하므로 플래너가 선택했습니다. 간단한 순차적 스캔 계획을 사용합니다. 인용 된 숫자 괄호 안에서 (왼쪽에서 오른쪽) :
예상 시작 비용. 이것은 이전에 소비 된 시간입니다 출력 단계는 예를 들어 정렬을 정렬 할 시간을 시작할 수 있습니다. 마디.
총 비용. 이것은 플랜 노드는 완료로 실행됩니다. 즉, 젠 토토 가능한 모든 행은 검색되었습니다. 실제로 노드의 상위 노드는 젠 토토 가능한 모든 행 읽기 ( 참조Limit아래 예).
이 계획 노드에 의한 추정 행 출력 수. 다시, 노드는 완료로 실행되는 것으로 가정합니다.
이 계획 노드에 의해 출력의 평균 평균 폭 바이트).
비용은 플래너의 비용 매개 변수 (참조섹션 18.7.2). 전통적인 관행은 단위의 비용을 측정하는 것입니다 디스크 페이지 페치; 즉,SEQ_PAGE_COSTis 전통적으로 설정1.0비용 매개 변수는 그것에 대해 설정됩니다. 이것의 예 섹션은 기본 비용 매개 변수로 실행됩니다.
상위 수준의 비용이 노드에는 모든 하위 노드의 비용이 포함됩니다. 또한 중요합니다 비용은 플래너가 반영한다는 것을 깨닫기 위해 걱정합니다. 특히 비용은 시간을 고려하지 않습니다 결과 행을 클라이언트에게 전송하는 데 소비되었으며 실제 경과 시간의 중요한 요소; 그러나 플래너는 무시합니다 계획을 변경하여 변경할 수 없기 때문입니다. (모든 정확한 계획은 동일한 행 세트를 출력합니다. 우리는 신뢰합니다.)
the행값은 약간 까다 롭습니다 그것은 처리 또는 스캔 한 행의 수가 아니기 때문에 노드를 계획하지만 오히려 노드에서 방출되는 숫자. 이것은 종종입니다 스캔 한 숫자 미만, 어떤 것도 필터링 한 결과여기서-임시 조건 노드에 적용됩니다. 이상적으로 최상위 행 추정치는 의지합니다 실제로 반환, 업데이트 된 행 수에 근사하십시오 쿼리로 삭제되었습니다.
예제로 돌아 가기 :
젠 토토 *에서 10에서 선택하십시오. 쿼리 계획 --------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
이 숫자는 매우 간단하게 파생됩니다. 그렇다면 :
relname = 'tenk1'; pg_class에서 reelpages, reltuples를 선택합니다.
당신은 그것을 알게 될 것입니다Tenk1
358이 있습니다
디스크 페이지 및 10000 행. 추정 비용은 (디스크
페이지 읽기 *SEQ_PAGE_COST) +
(줄 스캔 *cpu_tuple_cost).
기본적으로SEQ_PAGE_COSTis 1.0 andcpu_tuple_cost는 0.01이므로 추정됩니다
비용은 (358 * 1.0) + (10000 * 0.01) = 458입니다.
이제 쿼리를 수정하여 A여기서조건 :
SELECT * SELECT *에서 TENK1 where 1 <7000; 쿼리 계획 ------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 7001 너비 = 244) 필터 : (고유 한 <7000)
젠 토토출력 쇼 그만큼여기서조항이 A로 적용되고 있습니다"필터"seq에 첨부 된 조건 스캔 계획 노드. 이것은 계획 노드가 조건을 확인 함을 의미합니다 각 행에 대해 스캔하고 전달되는 행 만 출력합니다. 상태. 출력 행의 추정치는 그만큼여기서절. 그러나 스캔이 될 것입니다 여전히 10000 행을 모두 방문해야하므로 비용이 줄어들지 않았습니다. 사실 그것은 조금 올라갔습니다 (10000 *cpu_operator_cost, 정확하게) 추가 CPU 시간을 반영하려면여기서조건.
이 쿼리가 선택한 실제 행 수는 7000이지만 그만큼행추정치는 대략적인 것입니다. 만약에 이 실험을 복제하려고 시도하면 아마도 약간 다른 추정치; 또한 각각 변경 될 수 있습니다분석통계이기 때문에 명령 제작분석에서 가져 왔습니다 테이블의 무작위 샘플.
이제 조건을보다 제한적으로 만들자 :
젠 토토을 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 5.07..229.20 줄 = 101 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100)
여기서 플래너는 2 단계 계획을 사용하기로 결정했습니다 : 아이 노드 계획은 인덱스를 방문하여 일치하는 행의 위치를 찾습니다. 인덱스 조건, 그런 다음 상단 계획 노드가 실제로 가져옵니다. 테이블 자체에서 그 행. 행을 개별적으로 가져 오는 것이 많습니다 순차적으로 읽는 것보다 비싸지 만, 전부는 아닙니다. 테이블의 페이지를 방문해야합니다. 여전히 저렴합니다. 순차적 스캔보다. (두 가지 계획 수준을 사용하는 이유는입니다 상단 계획 노드는 비용을 최소화하기 위해 읽기 전에 물리적 순서로 색인 별도의 페치. 그만큼"비트 맵"노드 이름에 언급 된 것은 다음을 수행하는 메커니즘입니다. 정렬.)
이제 다른 조건을 추가합시다여기서절 :
tenk1에서 선택 *을 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 5.04..229.43 줄 = 1 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) 필터 : (stringu1 = 'xxx':: name) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100)
추가 조건StringU1 = 'xxx'출력 행 카운트 추정치를 줄이지 만 우리는 비용이 들지 않습니다. 여전히 같은 행 세트를 방문해야합니다.StringU1절로 적용 할 수 없습니다 이 인덱스는에만 있으므로 색인 조건고유 1열. 대신 필터 켜기로 적용됩니다 줄은 인덱스에 의해 검색되었습니다. 따라서 비용은 실제로 상승했습니다 이 추가 점검을 약간 반영합니다.
경우에 따라 플래너는 a를 선호합니다."Simple"색인 스캔 계획 :
onecior1 = 42에서 10에서 선택 *을 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------------------- Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.29..8.30 행 = 1 너비 = 244) 색인 조건 : (고유 1 = 42)
이 유형의 계획에서 테이블 행은 색인 순서대로 가져옵니다. 읽는 것이 더 비싸지 만 너무 적은 사람이 있습니다. 행 위치를 분류하는 데 드는 추가 비용은 그만한 가치가 없습니다. 당신은 가장 자주이 계획 유형을 가져 오는 쿼리에 대해 단일 행. 또한 종종에 젠 토토됩니다.주문인덱스와 일치하는 조건 주문, 주문을 만족시키기 위해 추가 분류 단계가 필요하지 않기 때문에주문.
여러 열에 별도의 인덱스가있는 경우 참조여기서, 플래너는 할 수 있습니다 인덱스의 및 또는 또는 또는 조합을 사용하도록 선택하십시오 :
Tenk1에서 선택 *을 선택하십시오. 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------. Tenk1의 비트 맵 힙 스캔 (비용 = 25.08..60.21 행 = 10 너비 = 244) COND를 다시 확인하십시오 : ((고유 1 <100) 및 (고유 2 9000)) - bitmapand (비용 = 25.08..25.08 행 = 10 너비 = 0) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100) - tenk1_unique2의 비트 맵 인덱스 스캔 (비용 = 0.00..19.78 행 = 999 너비 = 0) 색인 조건 : (고유 2 9000)
그러나 이것은 두 인덱스를 모두 방문해야하므로 반드시 필요한 것은 아닙니다. 하나의 색인을 사용하고 다른 색인을 처리하는 것과 비교 한 승리 필터로 조건. 당신이 관련된 범위를 변경하면 볼 수 있습니다 계획은 그에 따라 변경됩니다.
다음은의 효과를 보여주는 예입니다.Limit:
10 <100 및 고유 2 9000 리미트 2에서 10에서 선택 *을 선택하십시오. 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------. 한계 (비용 = 0.29..14.48 줄 = 2 너비 = 244) - tenk1에서 tenk1_unique2를 사용한 색인 스캔 (비용 = 0.29..71.27 행 = 10 너비 = 244) 색인 조건 : (고유 2 9000) 필터 : (고유 한 <100)
이것은 위와 동일한 쿼리이지만 A를 추가했습니다.Limit모든 행을 검색 할 필요는 없습니다. 그리고 플래너는해야 할 일에 대한 마음을 바꿨습니다. 그것을 주목하십시오 인덱스 스캔 노드의 총 비용 및 행 수가 마치 마치 마치 완료되었습니다. 그러나 한계 노드는 중지 될 것으로 예상됩니다 해당 행의 5 분의 1 만 검색 한 후 총 비용은 5 분의 1, 그것은 실제 추정 비용입니다. 질문. 이 계획은 한계 노드를 한도가 스타트 업 지불을 피할 수 없기 때문에 이전 계획 비트 맵 스캔 비용, 따라서 총 비용은 이상 그 접근법이있는 25 대.
우리가 있었던 열을 젠 토토하여 두 개의 테이블을 결합 해 보겠습니다. 토론 :
선택 선택 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <10 및 t1.unique2 = t2.unique2; 쿼리 계획 ----------------------------------------------------------------------------------------------------- 중첩 루프 (비용 = 4.65..118.62 행 = 10 너비 = 488) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.36..39.47 행 = 10 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <10) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.36 행 = 10 너비 = 0) 색인 조건 : (고유 1 <10) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.29..7.91 행 = 1 너비 = 244) 색인 조건 : (고유 2 = t1.unique2)
이 계획에는 두 개의 테이블이있는 중첩 루프 조인 노드가 있습니다. 입력 또는 어린이로 스캔합니다. 노드 요약의 압입 선은 계획 트리 구조를 반영합니다. 가입은 첫 번째, 또는"외부", 자식은 비트 맵 스캔과 유사합니다 우리가 전에 본 사람들에게. 비용과 행 수는 우리와 동일합니다. 에서 얻는다SELECT ... WHEREINED 1 <10우리가 적용하고 있기 때문에여기서절고유 한 <10해당 노드에서. 그만큼t1.unique2 = t2.unique2절은 그렇지 않습니다 아직 관련이 있으므로 외부 스캔의 행 수에 영향을 미치지 않습니다. 중첩 루프 조인 노드가 두 번째로 실행됩니다."내부"자식에서 얻은 각 행에 대해 한 번 외부 아이. 현재 외부 행의 열 값은 될 수 있습니다 내부 스캔에 연결; 여기,t1.unique2외부 행의 값을 젠 토토할 수 있습니다 우리는 단순한 것을 위해 위에서 본 것과 유사한 계획과 비용을받습니다선택 ... 여기서 t2.unique2 =Constant케이스. (추정 비용은입니다 실제로 위에서 보았던 것보다 약간 낮습니다. 반복 된 인덱스 스캔 중에 발생할 것으로 예상되는 캐싱T2.) 루프 노드의 비용은입니다 외부 스캔 비용과 하나의 반복에 기초하여 설정 각 바깥 쪽 줄 (10 * 7.87, 여기)에 대한 내부 스캔의 조인 처리를위한 CPU 시간이 거의 없습니다.
이 예에서 조인의 출력 행 카운트는 두 스캔 행의 산물이지만, 그것은 모두 사실이 아닙니다. 추가가있을 수 있기 때문에 사례여기서두 테이블을 언급하는 조항과 할 수 있습니다 입력 스캔이 아닌 결합 지점에서만 적용됩니다. 여기에 있습니다 예 :
선택 선택 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <10 및 t2.unique2 <10 및 t1.hundred <t2.hundred; 쿼리 계획 ------------------------------------------------------------------------------------------------------------------ 중첩 루프 (비용 = 4.65..49.46 줄 = 33 너비 = 488) 가입 필터 : (T1. Hundred <t2.hundred) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.36..39.47 행 = 10 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <10) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.36 행 = 10 너비 = 0) 색인 조건 : (고유 1 <10) - 구체화 (비용 = 0.29..8.51 행 = 10 너비 = 244) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.29..8.46 행 = 10 너비 = 244) 색인 조건 : (고유 2 <10)
조건t1.hundred < t2.hundred에서 테스트 할 수 없습니다Tenk2_unique2색인이므로 조인시에 적용됩니다 마디. 이렇게하면 결합 노드의 추정 출력 행 카운트가 줄어 듭니다. 그러나 입력 스캔을 변경하지 않습니다.
여기서 플래너가 선택한 것을 주목하십시오"실체화"조인의 내부 관계 구체화 된 계획 노드를 꼭대기에 두십시오. 이것은를 의미합니다.T2indexscan은 한 번만 수행됩니다 중첩 루프 결합 노드는 해당 데이터를 10 번 읽어야하지만 외부 관계에서 각 행마다 한 번. 구체화 노드 데이터를 읽을 때 메모리에 데이터를 저장 한 다음 데이터를 반환합니다. 각 후속 패스의 메모리에서.
OUTER 조인을 처리 할 때는 계획 노드 조치가 표시 될 수 있습니다. 둘 다"필터 가입"및 일반"필터"첨부 된 조건. 가입하다 필터 조건은 외부 조인에서 나옵니다on조항, 결합 필터에 실패하는 행입니다 상태는 여전히 널 확장 행로 방출 될 수 있습니다. 그러나 a 일반 필터 조건은 외부 결합 규칙에 따라 적용됩니다. 줄을 무조건적으로 제거하는 행동. 내부 가입에는 아니오가 있습니다 이러한 유형의 필터 간의 의미 론적 차이.
Query의 선택성을 약간 변경하면 매우 다른 조인 계획 :
선택 사항 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2; 쿼리 계획 ------------------------------------------------------------------------------------------------------------ 해시 조인 (비용 = 230.47..713.98 행 = 101 너비 = 488) 해시 조건 : (T2.Unique2 = t1.unique2) - TENK2 T2의 SEQ 스캔 (비용 = 0.00..445.00 행 = 10000 너비 = 244) - 해시 (비용 = 229.20..229.20 줄 = 101 너비 = 244) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 5.07..229.20 줄 = 101 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) 색인 조건 : (고유 1 <100)
여기, 플래너는 해시 조인을 사용하기로 선택했습니다. 한 테이블 중 하나의 메모리 해시 테이블에 입력 한 후 다른 테이블이 스캔되고 해시 테이블이 일치에 대해 조사됩니다. 각 행에. 다시 들여 쓰기가 계획을 어떻게 반영하는지 다시 주목하십시오 구조 : 비트 맵 스캔Tenk1is 해시 노드에 입력하여 해시 테이블을 구성합니다. 그게 그런 다음 해시 결합 노드로 돌아와서 행을 읽습니다. 외부 아동 계획 및 각각의 해시 테이블을 검색합니다.
또 다른 가능한 가입 유형은 병합 조인, 그림입니다. 여기:
선택 선택 * TENK1 T1, ONEK T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2; 쿼리 계획 ------------------------------------------------------------------------------------------------------------ 합병 조인 (비용 = 198.11..268.19 행 = 10 너비 = 488) 병합 Cond : (T1.unique2 = T2.Unique2) - tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔 (비용 = 0.29..656.28 행 = 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. (이것은 조잡한 도구이지만 유용합니다. 참조섹션 14.3.) 예를 들어, 우리가 순차적 인 스캔 앤 소트가 다루는 가장 좋은 방법이라고 확신하지 못했습니다 with tableONEK이전 예에서는 우리는 시도 할 수 있습니다
set enable_sort = off; 선택 * * TENK1 T1, ONEK T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2; 쿼리 계획 ------------------------------------------------------------------------------------------------------------ 합병 조인 (비용 = 0.56..292.65 행 = 10 너비 = 488) 병합 Cond : (T1.unique2 = T2.Unique2) - tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔 (비용 = 0.29..656.28 행 = 101 너비 = 244) 필터 : (고유 한 <100) - Onek t2에서 Onek_unique2를 사용한 색인 스캔 (비용 = 0.28..224.79 행 = 1000 너비 = 244)
플래너가 정렬을 생각한다는 것을 보여줍니다ONEKBy Index-Scanning은 약 12% 더 비쌉니다 순차적 인 스캔 및 소트보다. 물론 다음 질문은입니다 그것이 옳은지 여부. 우리는 그것을 젠 토토하는 것을 조사 할 수 있습니다분석, 아래 논의 된대로.
플래너 추정치의 정확도를 확인할 수 있습니다. 사용하여젠 토토's분석옵션. 이 옵션으로젠 토토실제로 쿼리를 실행 한 다음 실행합니다 진정한 행 카운트와 내부에 누적 된 실제 실행 시간을 표시합니다. 각 계획 노드와 동일한 추정치와 함께젠 토토쇼. 예를 들어, 우리는 얻을 수 있습니다 다음과 같은 결과 :
선택을 젠 토토하십시오 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <10 및 t1.unique2 = t2.unique2; 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. 중첩 루프 (비용 = 4.65..118.62 행 = 10 너비 = 488) (실제 시간 = 0.128..0.377 행 = 10 루프 = 1) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.36..39.47 행 = 10 너비 = 244) (실제 시간 = 0.057..0.121 행 = 10 루프 = 1) COND를 다시 확인하십시오 : (고유 1 <10) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.36 행 = 10 너비 = 0) (실제 시간 = 0.024..0.024 행 = 10 루프 = 1) 색인 조건 : (고유 1 <10) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.29..7.91 행 = 1 너비 = 244) (실제 시간 = 0.021..0.022 행 = 1 루프 = 10) 색인 조건 : (고유 2 = t1.unique2) 총 런타임 : 0.501 MS
"실제 시간"값 실시간 밀리 초, 반면비용추정치는 임의의 단위로 표현됩니다. 그래서 그들은 일치하지 않을 것입니다. 일반적으로 가장 큰 것 찾는 것이 중요합니다. 추정 행 카운트가 현실에 합리적으로 가깝습니다. 이 예에서는 추정치가 전부였습니다 데드 온이지만 실제로는 매우 드문 일입니다.
일부 쿼리 계획에서는 하위 플랜 노드가 가능합니다. 두 번 이상 실행되었습니다. 예를 들어, 내부 색인 스캔이 될 것입니다 위의 중첩 루프 계획에서 외부 행당 한 번 실행됩니다. 그런 식으로 사례,루프값은 총계를보고합니다 노드의 실행 수와 실제 시간과 행 표시된 값은 실행 중 평균입니다. 이것은 만들기 위해 수행됩니다 비용 추정치가 표시되는 방식과 비교할 수 있습니다. 곱하기루프총 시간은 실제로 노드에서 소비되었습니다. 위의 예에서는 우리가 인덱스 스캔을 실행하는 총 0.220 밀리 초 소비Tenk2.
경우에 따라분석쇼 계획 노드 실행을 넘어서 추가 실행 통계 시간과 행 계산. 예를 들어 정렬 및 해시 노드가 제공합니다 추가 정보 :
분석 선택 * TENK1 T1, TENK2 T2로부터 여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2 t1.fiveThous의 순서; 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------------------------- 정렬 (비용 = 717.34..717.59 행 = 101 너비 = 488) (실제 시간 = 7.761..7.774 줄 = 100 루프 = 1) 정렬 키 : T1. 피브 러스 정렬 방법 : QuickSort 메모리 : 77KB - 해시 조인 해시 조건 : (T2.Unique2 = t1.unique2) - TENK2 T2의 SEQ 스캔 (비용 = 0.00..445.00 행 = 10000 너비 = 244) (실제 시간 = 0.007..2.583 행 = 10000 루프 = 1) - 해시 (비용 = 229.20..229.20 줄 = 101 너비 = 244) (실제 시간 = 0.659..0.659 행 = 100 루프 = 1) 버킷 : 1024 배치 : 1 메모리 사용량 : 28KB - tenk1 t1의 비트 맵 힙 스캔 (비용 = 5.07..229.20 줄 = 101 너비 = 244) (실제 시간 = 0.080..0.526 행 = 100 루프 = 1) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) (실제 시간 = 0.049..0.049 행 = 100 루프 = 1) 색인 조건 : (고유 1 <100) 총 런타임 : 8.008 ms
정렬 노드는 젠 토토 된 정렬 방법을 보여줍니다 (특히, 정렬은 메모리 또는 온 디스크) 및 메모리 또는 디스크의 양 필요한 공간. 해시 노드는 해시 버킷의 수와 배치 및 해시에 젠 토토되는 피크 양의 메모리 테이블. (배치 수가 하나를 초과하면 디스크 공간 젠 토토이 관련되었지만 표시되지 않습니다.)
다른 유형의 추가 정보는 제거 된 행의 수입니다. 필터 조건으로 :
10 <7에서 10 <7; 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 7000 너비 = 244) (실제 시간 = 0.016..5.107 행 = 7000 루프 = 1) 필터 : (10 <7) 필터로 제거 된 행 : 3000 총 런타임 : 5.905ms
이 카운트는 필터 조건에 특히 유용 할 수 있습니다 조인 노드에서 적용됩니다. 그만큼"행 제거됨"줄은 적어도 하나의 스캔 행 또는 결합 노드의 경우 잠재적 인 결합 쌍은 필터 상태.
필터 조건과 유사한 경우"Lossy"인덱스 스캔. 예를 들어, 이것을 고려하십시오 특정 요점을 포함하는 다각형 검색 :
polygon_tbl에서 선택 * 선택 * f1 @ 다각형 '(0.5,2.0)'; 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. polygon_tbl에서의 seq 스캔 (cost = 0.00..1.05 줄 = 1 너비 = 32) (실제 시간 = 0.044..0.044 행 = 0 루프 = 1) 필터 : (f1 @ '((0.5,2))':: 다각형) 필터에 의해 제거 된 행 : 4 총 런타임 : 0.083 MS
플래너는이 샘플 테이블이 인덱스 스캔으로 귀찮게하기에는 너무 작아서 평원이 있습니다. 필터에 의해 모든 행이 거부 된 순차적 스캔 상태. 그러나 인덱스 스캔을 사용하도록 강요하면 다음을 볼 수 있습니다.
ENABLE_SEQSCAN을 OFF로 설정합니다. polygon_tbl에서 선택 * 선택 *을 젠 토토하십시오. 여기서 f1 @ 다각형 '(0.5,2.0)'; 쿼리 계획 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. polygon_tbl에서 gpolygonind를 사용한 인덱스 스캔 (비용 = 0.13..8.15 행 = 1 너비 = 32) (실제 시간 = 0.062..0.062 행 = 0 루프 = 1) 색인 조건 : (f1 @ '((0.5,2))':: 다각형) 인덱스 재확인으로 제거 된 행 : 1 총 런타임 : 0.144 ms
여기서 우리는 인덱스가 하나의 후보 행을 반환했음을 알 수 있습니다. 그런 다음 인덱스 조건의 재전송으로 거부되었습니다. 이런 일이 발생합니다 GIST 지수가이기 때문에"Lossy"for 다각형 격리 테스트 : 실제로 행을 반환합니다 대상과 겹치는 다각형이 정확한 일을해야합니다. 그 행에 대한 격리 테스트.
젠 토토a버퍼분석더 많은 실행 시간 통계를 얻으려면 :
젠 토토 (분석, 버퍼) 선택 * 10 <100 및 고유 2 9000에서 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. Tenk1의 비트 맵 힙 스캔 (비용 = 25.08..60.21 행 = 10 너비 = 244) (실제 시간 = 0.323..0.342 행 = 10 루프 = 1) COND를 다시 확인하십시오 : ((고유 1 <100) 및 (고유 2 9000)) 버퍼 : 공유 적중 = 15 - bitmapand (비용 = 25.08..25.08 행 = 10 너비 = 0) (실제 시간 = 0.309..0.309 행 = 0 루프 = 1) 버퍼 : 공유 적중 = 7 - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) (실제 시간 = 0.043..0.043 행 = 100 루프 = 1) 색인 조건 : (고유 1 <100) 버퍼 : 공유 적중 = 2 - tenk1_unique2의 비트 맵 인덱스 스캔 (비용 = 0.00..19.78 행 = 999 너비 = 0) (실제 시간 = 0.227..0.227 행 = 999 루프 = 1) 색인 조건 : (고유 2 9000) 버퍼 : 공유 적중 = 5 총 런타임 : 0.423 ms
제공 한 숫자버퍼도움 쿼리의 어떤 부분이 가장 I/O 집약적인지 식별합니다.
이를 명심하십시오젠 토토 분석실제로 쿼리를 실행하면 부작용이 발생합니다 평소와 같이, 쿼리가 출력 할 수있는 결과는 무엇이든 인쇄에 찬성하여 폐기젠 토토데이터. 없이 데이터 수정 쿼리를 분석하려면 테이블을 변경하면 나중에 명령을 다시 굴릴 수 있습니다. 예:
시작; Analyze Update Tenk1 세트 백 = 백 + 1 여기서 고유 1 <100; 쿼리 계획 -------------------------------------------------------------------------------------------------------------------------------- Tenk1에 대한 업데이트 (비용 = 5.07..229.46 행 = 101 너비 = 250) (실제 시간 = 14.628..14.628 행 = 0 루프 = 1) - tenk1의 비트 맵 힙 스캔 (비용 = 5.07..229.46 행 = 101 너비 = 250) (실제 시간 = 0.101..0.439 행 = 100 루프 = 1) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..5.04 행 = 101 너비 = 0) (실제 시간 = 0.043..0.043 행 = 100 루프 = 1) 색인 조건 : (고유 1 <100) 총 런타임 : 14.727ms 롤백;
이 예에서 볼 수 있듯이 쿼리가 A an 일 때삽입, 업데이트또는삭제명령, 실제 작업 테이블 변경 적용은 최상위 삽입, 업데이트, 또는 계획 노드를 삭제합니다. 이 노드 아래의 계획 노드가 수행됩니다 이전 행을 찾거나 새로운 데이터를 계산하는 작업. 그래서 위에서, 우리는 우리가 본 것과 같은 종류의 비트 맵 테이블 스캔을 볼 수 있습니다. 이미, 출력은 업데이트 된 행. 데이터 수정이지만 주목할 가치가 있습니다 노드는 상당한 양의 실행 시간이 걸릴 수 있습니다 (여기, 그것은 기획자는 시간의 사자의 몫을 소비하면서 현재 비용 추정치에 무엇이든 추가하여이를 젠 토토합니다. 일하다. 해야 할 작업은마다 동일하기 때문입니다. 정확한 쿼리 계획이므로 계획 결정에 영향을 미치지 않습니다.
the총 런타임표시분석집행자 스타트 업 포함 종료 시간과 트리거를 실행할 시간 해고되었지만 구문 분석, 재 작성 또는 계획은 포함되지 않습니다. 시간. 실행하는 데 소요되는 시간전관련 삽입 시간에 트리거가 포함되어 있습니다. 업데이트 또는 삭제 노드; 하지만 실행하는 데 소요되는 시간이후트리거가 계산되지 않기 때문에이후완료 후 트리거가 발사됩니다 전체 계획의. 각 방아쇠에 소비 된 총 시간 (하나전또는이후) 또한 별도로 표시됩니다. 지연된 제약 조건 트리거가 발생합니다 거래 종료까지 실행되지 않으므로 전혀 표시분석 젠 토토.
실행 시간에 의해 측정되는 두 가지 중요한 방법이 있습니다분석정상에서 벗어날 수 있습니다
동일한 쿼리 실행. 첫째, 출력 행이 없기 때문에
클라이언트, 네트워크 전송 비용 및 I/O에게 제공됩니다
전환 비용은 포함되지 않습니다. 둘째, 측정 오버 헤드
추가분석할 수 있습니다
특히 느린 기계에서 중요합니다gettimeofday ()
운영 시스템 호출. 당신은 할 수 있습니다
젠 토토젠 토토 : 문서 : 9.3측정하는 도구
시스템의 타이밍 오버 헤드.
젠 토토결과는 아니어야합니다 당신이있는 것과 훨씬 다른 상황에 외삽 된 실제로 테스트; 예를 들어 장난감 크기의 테이블의 결과는 할 수 없습니다 큰 테이블에 적용되는 것으로 가정합니다. 플래너의 비용 추정 선형이 아니므로 더 큰 계획을 선택할 수 있습니다. 또는 더 작은 테이블. 극단적 인 예는 하나의 디스크 페이지를 점유하면 거의 항상 순차적 스캔을받을 수 있습니다. 인덱스 사용 가능 여부를 계획하십시오. 플래너는 깨달았습니다 테이블을 처리하기 위해 하나의 디스크 페이지를 읽을 것입니다. 모든 경우에도 추가 페이지 읽기를 소비하는 데 가치가 없습니다. 색인을보십시오. (우리는 이런 일이 일어나는 것을 보았습니다polygon_tbl위의 예.)
실제 및 예상 값이하지 않는 경우가 있습니다. 잘 일치하지만 실제로는 잘못된 것이 없습니다. 그러한 사례 중 하나가 발생합니다 계획 노드 실행이 a에 의해 짧게 중지 될 때Limit또는 유사한 효과. 예를 들어,에서LIMIT이전에 젠 토토한 쿼리,
Tenk1에서 선택 * 선택 *을 젠 토토하십시오. 쿼리 계획 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. 한계 (비용 = 0.29..14.71 행 = 2 너비 = 244) (실제 시간 = 0.177...0.249 행 = 2 루프 = 1) - Index Scan using tenk1_unique2 on tenk1 (cost=0.29..72.42 rows=10 width=244) (actual time=0.174..0.244 rows=2 loops=1) 색인 조건 : (고유 2 9000) 필터 : (고유 한 <100) 필터로 제거 된 행 : 287 총 런타임 : 0.336 ms
인덱스 스캔 노드의 추정 비용 및 행 수는 다음과 같습니다. 마치 완료로 실행되는 것처럼 보입니다. 그러나 실제로 한계 노드가 2 개를 얻은 후 행 요청 중지를 중지 했으므로 실제 행 카운트는 2에 불과하고 런타임은 비용 추정치보다 적습니다. 제안 할 것입니다. 이것은 추정 오류가 아니라 불일치 일뿐입니다 추정치와 실제 값이 표시되는 방식으로.
합병 결합은 또한 혼란 스러울 수있는 측정 아티팩트도 있습니다. 조심성 없는. 병합 조인은 소진되면 하나의 입력을 읽지 않습니다. 하나의 입력에서 다른 입력과 다음 키 값은 더 큽니다. 다른 입력의 마지막 키 값보다; 그런 경우에 더 이상 일치 할 수 없으므로 나머지 부분을 스캔 할 필요가 없습니다. 입력. 이로 인해 한 아이를 모두 읽지 않고 결과가 나옵니다. 언급 된 것과 같이Limit. 또한 IF 외부 (첫 번째) 자식에는 키 값이 중복 된 행이 포함되어 있습니다. 내부 (두 번째) 자녀가 백업되고 그 부분에 대해 철회됩니다. 그 주요 가치와 일치하는 행의 줄.젠 토토 분석동일한 내부 행 의이 반복 배출량을 계산합니다 마치 그들이 진짜 추가 행 인 것처럼. 외부가 많을 때 중복, 내부 아동 계획에 대한보고 된 실제 행 카운트 노드는 실제로 내면의 관계에서.
비트 맵 및 비트 맵 노드는 항상 실제 행을보고합니다 구현 제한으로 인해 0으로 계산됩니다.
이전 | 배트맨 젠 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
성능 팁 | up | 입안자 |