이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 14.1. 설명 토토 사이트 순위버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

14.1. 사설 토토사설 토토

포스트그레SQL고안쿼리 계획수신하는 각 쿼리에 대해. 쿼리 구조와 쿼리 구조에 맞는 올바른 계획 선택 데이터의 속성은 좋은 결과를 위해 절대적으로 중요합니다. 성능이 있으므로 시스템에는 복잡한 내용이 포함되어 있습니다.플래너좋은 계획을 선택하려고 노력합니다. 당신은 할 수 있습니다 사설 토토하다토토 커뮤니티 : 문서 : 9.2 : 설명보라는 명령 플래너가 쿼리에 대해 생성하는 쿼리 계획입니다. 계획 읽기 마스터하려면 약간의 경험이 필요한 예술이지만, 섹션에서는 기본 사항을 다루려고 합니다.

이 섹션의 예는 회귀 테스트에서 추출되었습니다. 다음을 수행한 후 데이터베이스진공 분석, 9.2 개발 소스를 사용합니다. 비슷하게 나올 수 있어야지 예제를 직접 시도해 보면 결과가 나오지만 예상 결과는 다음과 같습니다. 비용과 행 개수는 약간 다를 수 있습니다.분석의 통계는 무작위 샘플입니다. 정확한 것보다 비용이 본질적으로 다소 다르기 때문에 플랫폼에 따라 다릅니다.

예시 사설 토토사설 토토의 기본값"텍스트"컴팩트한 출력 형식 인간이 읽기에 편리합니다. 먹이를 주고 싶다면사설 토토10862_11000

14.1.1. 사설 토토기본사항

쿼리 계획의 구조는 트리입니다.계획 노드. 최하위 수준의 노드 tree는 스캔 노드입니다. 테이블에서 원시 행을 반환합니다. 거기 다양한 테이블 액세스를 위한 다양한 유형의 스캔 노드 방법: 순차 스캔, 인덱스 스캔, 비트맵 인덱스 스캔. 다음과 같은 테이블이 아닌 행 소스도 있습니다.절 및 집합 반환 함수발신11655_12031사설 토토다음에 대한 한 줄이 있습니다. 기본 노드 유형과 함께 계획 트리의 각 노드를 보여줍니다. 계획자가 실행을 위해 작성한 비용 추정치 그 계획 노드. 추가 줄이 나타날 수 있습니다. 노드의 추가 속성을 표시하기 위한 노드의 요약 줄 마디. 첫 번째 줄(최상위의 요약 줄) 노드)에는 계획에 대한 예상 총 실행 비용이 있습니다. 그것 기획자가 최소화하려고 하는 숫자입니다.

다음은 출력이 무엇인지 보여주기 위한 간단한 예입니다. 다음과 같습니다:

사설 토토 선택 * FROM tenk1;

                         쿼리 계획
------------------------------------------------
 tenk1의 시퀀스 스캔(비용=0.00..458.00행=10000너비=244)

이 쿼리에는 다음이 없으므로어디절, 테이블의 모든 행을 스캔해야 하므로 플래너는 간단한 순차 스캔 계획을 사용하기로 선택했습니다. 숫자 괄호 안에 인용된 내용은 다음과 같습니다(왼쪽에서 오른쪽으로):

  • 예상 시작 비용. 소모된 시간입니다 출력 단계가 시작되기 전(예: 출력 단계를 수행할 시간) 정렬 노드에서 정렬합니다.

  • 추정 총 비용. 가정하에 기재한 내용입니다 계획 노드가 완료될 때까지 실행됩니다. 즉, 모든 사용 가능한 행이 검색됩니다. 실제로 노드의 부모 노드가 사용 가능한 모든 행을 읽지 못하고 중지될 수 있습니다(참조: 그만큼제한아래 예).

  • 이 계획 노드에 의해 출력된 예상 행 수입니다. 다시 말하지만, 노드는 완료될 때까지 실행되는 것으로 가정됩니다.

  • 이 계획 노드에 의해 출력된 행의 예상 평균 너비 (바이트 단위).

비용은 다음에 의해 결정된 임의의 단위로 측정됩니다. 기획자의 비용 매개변수(참조섹션 18.7.2). 전통적인 관행은 비용을 측정하는 것입니다. 디스크 페이지 가져오기 단위; 즉,seq_page_cost일반적으로 다음과 같이 설정됩니다.1.0그리고 다른 비용 매개변수는 이를 기준으로 설정됩니다. 의 예 이 섹션은 기본 비용 매개변수를 사설 토토하여 실행됩니다.

상위 수준의 비용이 노드에는 모든 하위 노드의 비용이 포함됩니다. 그것은 또한 비용에는 다음 사항만 반영된다는 점을 깨닫는 것이 중요합니다. 기획자가 신경 쓴다. 특히 비용이 들지 않는다. 결과 행을 클라이언트에 전송하는 데 소요된 시간을 고려하십시오. 이는 실제 경과 시간에 중요한 요소가 될 수 있습니다. 하지만 기획자는 이를 변경할 수 없기 때문에 이를 무시합니다. 계획을 변경합니다. (모든 올바른 계획은 동일한 행을 출력합니다. 설정, 우리는 신뢰합니다.)

값이 조금 까다롭습니다. 왜냐하면 처리되거나 스캔된 행의 수가 아니기 때문입니다. 계획 노드가 아니라 노드에서 내보낸 숫자입니다. 이것 필터링 결과 스캔된 숫자보다 적은 경우가 많습니다. 누구든지어디-절 조건 노드에 적용되고 있습니다. 이상적으로는 최상위 행 추정치는 실제로 반환된 행 수와 비슷합니다. 쿼리에 의해 업데이트되거나 삭제되었습니다.

예로 돌아가기:

사설 토토 선택 * FROM tenk1;

                         쿼리 계획
------------------------------------------------
 tenk1의 시퀀스 스캔(비용=0.00..458.00행=10000너비=244)

이 숫자는 매우 간단하게 파생됩니다. 당신이 하다:

pg_class WHERE relname = 'tenk1'에서 relpages, reltuples 선택;

당신은 그것을 발견할 것입니다tenk1있음 358개의 디스크 페이지와 10,000개의 행. 예상 비용이 계산됩니다. as (읽은 디스크 페이지 수 *seq_page_cost) + (스캔된 행 *cpu_tuple_cost). 기본적으로,seq_page_cost1.0이고cpu_tuple_cost은 0.01이므로 예상 비용은 (358 * 1.0) + (10000 * 0.01) = 458입니다.

이제 쿼리를 수정하여 다음을 추가하겠습니다.어디조건:

사설 토토 선택 * FROM tenk1 WHERE 고유1 < 7000;

                         쿼리 계획
----------------------------------
 tenk1의 시퀀스 스캔(비용=0.00..483.00행=7001너비=244)
   필터: (고유1 < 7000)

다음에 주목하세요.사설 토토출력 를 보여줍니다.어디에서절 적용 중 으로"필터"다음에 조건이 첨부됨 Seq Scan 계획 노드. 이는 계획 노드가 다음을 확인함을 의미합니다. 스캔하는 각 행의 조건을 지정하고 해당 행만 출력합니다. 조건을 통과한 것입니다. 출력 행의 추정치는 다음과 같습니다. 다음으로 인해 감소했습니다.어디절. 그러나 스캔은 여전히 ​​10000개 행을 모두 방문해야 하므로 비용은 줄어들지 않았습니다. 실제로는 조금 올랐습니다( 10000 *cpu_operator_cost, 정확하게는) 확인에 소요된 추가 CPU 시간을 반영하기 위해어디조건.

이 쿼리가 선택하는 실제 행 수는 7000개입니다. 하지만추정은 단지 근사치를 내다. 이 실험을 복제하려고 하면 아마도 약간 다른 추정치를 얻게 될 것입니다. 게다가 그럴 수 있어. 매번 변경분석명령, 왜냐하면분석다음의 무작위 표본에서 가져옵니다. 테이블.

이제 조건을 더욱 제한적으로 만들어 보겠습니다.

사설 토토 선택 * FROM tenk1 WHERE 고유1 < 100;

                                  쿼리 계획
----------------------------------------------------
 tenk1의 비트맵 힙 스캔(비용=5.03..229.17행=101 너비=244)
   조건 재확인: (unique1 < 100)
   - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.01 행=101 너비=0)
         인덱스 조건: (unique1 < 100)

여기서 기획자는 2단계 계획을 사용하기로 결정했습니다: 하위 계획 노드는 인덱스를 방문하여 행 위치를 찾습니다. 인덱스 조건과 일치한 다음 상위 계획 노드 실제로 테이블 자체에서 해당 행을 가져옵니다. 가져오는 중 행을 별도로 읽는 것은 읽는 것보다 훨씬 비쌉니다. 순차적으로 수행되지만 테이블의 모든 페이지에 방문하려면 순차 스캔보다 비용이 여전히 저렴합니다. (두 가지 계획 수준을 사용하는 이유는 상위 계획이 노드는 인덱스로 식별된 행 위치를 다음으로 정렬합니다. 읽기 전에 물리적인 순서를 정하여 비용을 최소화하십시오. 별도의 가져오기. 그만큼"비트맵"노드 이름에 언급된 것은 다음을 수행하는 메커니즘입니다. 정렬 중입니다.)

이제 다른 조건을 추가하겠습니다어디절:

사설 토토 선택 * FROM tenk1 WHERE Unique1 < 100 AND stringu1 = 'xxx';

                                  쿼리 계획
----------------------------------------------------
 tenk1의 비트맵 힙 스캔(비용=5.01..229.40행=1너비=244)
   조건 재확인: (unique1 < 100)
   필터: (stringu1 = 'xxx'::name)
   - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.01 행=101 너비=0)
         인덱스 조건: (unique1 < 100)

추가된 조건stringu1 = '트리플 엑스'출력 행 수 추정치를 줄이지만 여전히 동일한 행 집합을 방문해야 하기 때문에 비용이 듭니다. 주의할 점은stringu1절은 할 수 없습니다 이 인덱스는 다음에만 적용되므로 인덱스 조건으로 적용됩니다. 그만큼고유1열. 대신에 그것은 인덱스로 검색된 행에 필터로 적용됩니다. 따라서 이 추가 비용을 반영하기 위해 실제로 비용이 약간 증가했습니다. 확인 중입니다.

어떤 경우에는 기획자가 다음을 선호할 것입니다."간단함"색인 스캔 계획:

사설 토토 선택 * FROM tenk1 WHERE 고유1 = 42;

                                 쿼리 계획
----------------------------------------------------------------
 tenk1에서 tenk1_unique1을 사용하는 인덱스 스캔(비용=0.00..8.27행=1너비=244)
   인덱스 조건: (unique1 = 42)

이 유형의 계획에서는 테이블 행을 색인으로 가져옵니다 주문을 하면 읽기 비용이 더 많이 들지만, 너무 적기 때문에 행 위치를 정렬하는 데 드는 추가 비용은 다음과 같습니다. 그럴 가치가 없습니다. 쿼리에 대해 이 계획 유형을 가장 자주 보게 됩니다. 단일 행만 가져옵니다. 쿼리에도 자주 사용됩니다. 는주문 기준조건은 다음과 같습니다 추가 정렬 단계가 없기 때문에 인덱스 순서와 일치합니다. 만족시키기 위해 필요함주문 기준.

에서 참조된 여러 열에 인덱스가 있는 경우어디, 플래너는 다음을 사용하도록 선택할 수 있습니다. 인덱스의 AND 또는 OR 조합:

사설 토토 선택 * FROM tenk1 여기서 고유1 < 100 AND 고유2  9000;

                                     쿼리 계획
------------------------------------------------------------------------
 tenk1의 비트맵 힙 스캔(비용=25.01..60.14행=10너비=244)
   조건을 다시 확인하세요: ((unique1 < 100) AND (unique2  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)
               지수 조건: (unique2  9000)

그러나 이것은 두 색인을 모두 방문해야 하므로 그렇지 않습니다. 단 하나의 인덱스를 사설 토토하고 처리하는 것에 비해 필연적으로 승리합니다. 다른 조건은 필터입니다. 범위를 다양하게 하면 관련 내용에 따라 계획이 변경되는 것을 확인하실 수 있습니다.

다음은 효과를 보여주는 예입니다제한:

사설 토토 선택 * FROM tenk1 WHERE 고유1 < 100 AND 고유2  9000 LIMIT 2;

                                     쿼리 계획
------------------------------------------------------------------------
 제한(비용=0.00..14.25행=2너비=244)
   - tenk1에서 tenk1_unique2를 사용한 인덱스 스캔(비용=0.00..71.23행=10너비=244)
         인덱스 조건: (unique2  9000)
         필터: (고유1 < 100)

이것은 위와 동일한 쿼리이지만 다음을 추가했습니다.제한그래서 모든 행이 필요하지는 않습니다. 찾았고 기획자는 무엇을 해야할지 마음을 바꿨습니다. Index Scan 노드의 총 비용과 행 개수를 확인하세요. 실행이 완료된 것처럼 표시됩니다. 그러나 한도 노드는 그 중 5분의 1만 검색한 후 중지될 것으로 예상됩니다. 행이므로 총 비용은 5분의 1에 불과합니다. 쿼리의 실제 예상 비용입니다. 이 계획이 더 선호됩니다 한도 때문에 이전 계획에 한도 노드를 추가합니다. 비트맵 스캔 시작 비용을 피할 수 없었기 때문에 총 비용은 25개 이상이 될 것입니다. 접근하다.

우리가 설정한 열을 사설 토토하여 두 테이블을 결합해 보겠습니다. 논의 중:

사설 토토 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 10 AND t1.unique2 = t2.unique2;

                                      쿼리 계획
-------------------------------------------------------------------------
 중첩 루프(비용=4.33..118.25행=10너비=488)
   - tenk1 t1의 비트맵 힙 스캔(비용=4.33..39.44행=10너비=244)
         조건 재확인: (unique1 < 10)
         - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..4.33행=10너비=0)
               지수 조건: (고유1 < 10)
   - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔(비용=0.00..7.87 행=1 너비=244)
         인덱스 조건: (unique2 = t1.unique2)

이 계획에는 두 개의 테이블이 있는 중첩 루프 조인 노드가 있습니다. 입력 또는 하위로 스캔합니다. 노드의 들여쓰기 요약 줄은 계획 트리 구조를 반영합니다. 조인의 먼저 또는"외부", 하위는 비트맵입니다. 이전에 본 것과 유사한 스캔을 수행합니다. 비용과 행 개수는 다음과 같습니다. 우리가 얻을 것과 동일선택...어디 고유1 < 10우리는 다음을 적용하고 있기 때문에어디에서고유1 < 10그 노드에서. 그만큼t1.unique2 = t2.unique2절은 아직 관련이 없으므로 그렇지 않습니다. 외부 스캔의 행 수에 영향을 미칩니다. 중첩 루프 조인 노드가 두 번째로 실행됩니다. 또는"내부"자식은 외부 하위에서 얻은 각 행에 대해 한 번입니다. 열 현재 외부 행의 값을 내부 행에 연결할 수 있습니다. 주사; 여기,t1.unique2값의 값 바깥쪽 행을 사설 토토할 수 있으므로 비슷한 계획과 비용을 얻습니다. 간단히 말해서 위에서 본 내용과 같습니다.선택 ... t2.unique2 = 위치상수사례. (예상 비용 결과적으로 위에서 본 것보다 실제로는 약간 낮습니다. 반복되는 인덱스 중에 발생할 것으로 예상되는 캐싱 스캔 중t2.) 루프 비용 그런 다음 외부 스캔 비용을 기준으로 노드가 설정됩니다. 각 외부 행에 대한 내부 스캔을 한 번 더 반복합니다(10 * 7.87, 여기), 조인 처리를 위한 약간의 CPU 시간이 추가됩니다.

이 예에서 조인의 출력 행 개수는 다음과 같습니다. 두 스캔의 행 개수를 곱한 값이지만 이는 사실이 아닙니다. 모든 경우에 추가 사항이 있을 수 있으므로어디두 테이블을 모두 언급하는 절 등 조인 포인트에만 적용할 수 있으며 두 입력에는 적용할 수 없습니다. 주사. 예를 들어 조건을 하나 더 추가하면 다음과 같습니다.

사설 토토 선택 *
tenk1 t1, tenk2 t2에서
여기서 t1.unique1 < 10 AND t1.unique2 = t2.unique2 AND t1.hundred < t2.hundred;

                                      쿼리 계획
-------------------------------------------------------------------------
 중첩 루프(비용=4.33..118.28행=3너비=488)
   조인 필터: (t1.hundred < t2.hundred)
   - tenk1 t1의 비트맵 힙 스캔(비용=4.33..39.44행=10너비=244)
         조건 재확인: (unique1 < 10)
         - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..4.33행=10너비=0)
               지수 조건: (고유1 < 10)
   - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔(비용=0.00..7.87 행=1 너비=244)
         인덱스 조건: (unique2 = t1.unique2)

추가 조건t1.백 < t2.백다음에서는 테스트할 수 없습니다.tenk2_unique2색인이므로 조인 시 적용됩니다. 마디. 이렇게 하면 조인의 예상 출력 행 수가 줄어듭니다. 노드이지만 입력 스캔은 변경하지 않습니다.

외부 조인을 처리할 때 조인 계획 노드가 나타날 수 있습니다. 둘 다와 함께"가입 필터"그리고 일반"필터"조건이 첨부되었습니다. 가입하다 필터 조건은 외부 조인에서 나옵니다.ON절이므로 조인 필터에 실패한 행 조건은 여전히 ​​null 확장 행으로 내보내질 수 있습니다. 하지만 일반 필터 조건은 외부 조인 규칙 이후에 적용됩니다. 따라서 무조건 행을 제거하는 역할을 합니다. 내부 조인에서 이러한 유형 사이에는 의미상 차이가 없습니다. 필터.

쿼리의 선택성을 약간 변경하면 매우 다른 가입 계획:

사설 토토 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                        쿼리 계획
-----------------------------------------------------------------------------
 해시 조인(비용=230.43..713.94행=101 너비=488)
   해시 조건: (t2.unique2 = t1.unique2)
   - tenk2 t2의 시퀀스 스캔(비용=0.00..445.00 행=10000 너비=244)
   - 해시(비용=229.17..229.17행=101 너비=244)
         - tenk1 t1의 비트맵 힙 스캔(비용=5.03..229.17 행=101 너비=244)
               조건 재확인: (unique1 < 100)
               - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.01 행=101 너비=0)
                     인덱스 조건: (unique1 < 100)

여기서 플래너는 해시 조인을 사용하기로 선택했습니다. 한 테이블의 행이 메모리 내 해시 테이블에 입력되고, 그 후 다른 테이블이 스캔되고 해시 테이블이 생성됩니다. 각 행과 일치하는지 검색합니다. 다시 한 번 들여쓰기가 어떻게 이루어졌는지 주목하세요. 계획 구조를 반영합니다: 비트맵 스캔에 대한tenk1은 해시 노드에 대한 입력입니다. 해시 테이블을 구성합니다. 그런 다음 해시로 반환됩니다. 외부 하위 계획에서 행을 읽는 조인 노드 각각에 대한 해시 테이블을 검색합니다.

또 다른 가능한 조인 유형은 병합 조인입니다. 여기:

사설 토토 선택 *
tenk1 t1, onek t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                        쿼리 계획
-----------------------------------------------------------------------------
 병합 조인(비용=197.83..267.93행=10너비=488)
   조건 병합: (t1.unique2 = t2.unique2)
   - tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔(비용=0.00..656.25 행=101 너비=244)
         필터: (고유1 < 100)
   - 정렬(비용=197.83..200.33행=1000 너비=244)
         정렬 키: t2.unique2
         - onek t2의 시퀀스 스캔(비용=0.00..148.00 행=1000 너비=244)

병합 조인은 조인에서 입력 데이터를 정렬해야 합니다. 열쇠. 이 계획에서는tenk1데이터는 올바른 행을 방문하기 위해 인덱스 스캔을 사설 토토하여 정렬 순서가 있지만 순차 스캔 및 정렬이 선호됩니다.오네크, 행이 더 많기 때문입니다. 그 테이블을 방문하게 됩니다. (순차 스캔 및 정렬 많은 행을 정렬하기 위해 인덱스 스캔을 자주 능가합니다. 인덱스에 필요한 비순차적 디스크 액세스 주사.)

변형 계획을 보는 한 가지 방법은 계획자가 다음을 수행하도록 강제하는 것입니다. 가장 저렴하다고 생각되는 전략은 무시하고 사설 토토된 활성화/비활성화 플래그섹션 18.7.1. (이것은 조잡한 도구이지만 유용합니다. 또한 참조하십시오.PostgreSQL : 문서 : 9.2 : 명시 적 조인 조항으로 토토 커뮤니티 제어.) 예를 들어, 순차 스캔 및 정렬이 최선이라는 확신이 없다면 테이블을 다루는 방법오네크안에 이전 예를 시도해 볼 수 있습니다.

SET 활성화_정렬 = 꺼짐;

사설 토토 선택 *
tenk1 t1, onek t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                        쿼리 계획
-----------------------------------------------------------------------------
 병합 조인(비용=0.00..292.36행=10너비=488)
   조건 병합: (t1.unique2 = t2.unique2)
   - tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔(비용=0.00..656.25 행=101 너비=244)
         필터: (고유1 < 100)
   - onek t2에서 onek_unique2를 사용한 인덱스 스캔(비용=0.00..224.76행=1000너비=244)

플래너가 정렬을 생각하고 있음을 보여줍니다.오네크인덱스 스캔을 통해 약 12% 더 향상되었습니다. 순차 스캔 및 정렬보다 비용이 많이 듭니다. 물론 다음에는 문제는 그것이 맞는지 여부입니다. 우리는 조사할 수 있습니다 그 사용분석 사설 토토, 아래에서 논의됩니다.

14.1.2. 사설 토토하세요 분석

기획자의 정확성을 확인할 수 있습니다 를 사설 토토하여 추정사설 토토's분석옵션. 이 옵션을 사설 토토하면,사설 토토실제로 쿼리를 실행합니다. 그런 다음 실제 행 수와 실제 런타임을 표시합니다. 동일한 계획 노드 내에 누적된 평범한 것으로 추정됩니다사설 토토쇼. 예를 들어 다음과 같은 결과를 얻을 수 있습니다.

사설 토토 분석 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 10 AND 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..0.380 행=10 루프=1)
         조건 재확인: (unique1 < 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)
         인덱스 조건: (unique2 = t1.unique2)
 총 런타임: 2.414ms

참고하세요"실제 시간"값은 실시간의 밀리초 단위인 반면,비용추정치는 임의의 단위로 표현됩니다. 그래서 그들은 일치하지 않을 것 같습니다. 평소에 가장 많이 하는 일이 찾아야 할 중요한 것은 예상 행 수가 다음과 같은지 여부입니다. 합리적으로 현실에 가깝습니다. 이 예에서 추정치는 다음과 같습니다. 모두 막혔지만 실제로는 매우 이례적입니다.

일부 쿼리 계획에서는 하위 계획 노드가 두 번 이상 실행되었습니다. 예를 들어, 내부 인덱스 스캔은 위의 중첩 루프 계획에서 외부 행당 한 번씩 실행됩니다. 그러한 경우에는루프값 보고서 노드의 총 실행 횟수와 실제 시간 표시된 행 값은 실행당 평균입니다. 이 작업이 완료되었습니다 비용과 수치를 비교할 수 있도록 하기 위해 추정치가 표시됩니다. 를 곱한다루프실제로 소요된 총 시간을 구하는 값 노드에서. 위의 예에서는 총 0.480을 지출했습니다. 인덱스 스캔을 실행하는 밀리초tenk2.

어떤 경우에는분석 사설 토토쇼 계획 노드 실행 이외의 추가 실행 통계 시간 및 행 수. 예를 들어 정렬 및 해시 노드는 다음을 제공합니다. 추가 정보:

사설 토토 분석 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2 ORDER BY t1.fivethous;

                                                                 쿼리 계획
------------------------------------------------------------------------------------------------------------------
 정렬(비용=717.30..717.56행=101너비=488)(실제 시간=104.950..105.327행=100루프=1)
   정렬 키: t1.fivethous
   정렬 방법: 퀵 정렬 메모리: 68kB
   - 해시 조인(비용=230.43..713.94 행=101 너비=488) (실제 시간=3.680..102.396 행=100 루프=1)
         해시 조건: (t2.unique2 = t1.unique2)
         - tenk2 t2의 Seq 스캔(비용=0.00..445.00 행=10000 너비=244)(실제 시간=0.046..46.219 행=10000 루프=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)
                     조건 재확인: (unique1 < 100)
                     - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.01 행=101 너비=0)(실제 시간=0.390..0.390 행=100 루프=1)
                           지수 조건: (고유1 < 100)
 총 런타임: 107.392ms

정렬 노드는 사용된 정렬 방법을 보여줍니다(특히, 정렬이 메모리 내인지 디스크 내인지 여부) 및 메모리나 디스크 공간이 필요합니다. 해시 노드는 다음의 수를 보여줍니다. 해시 버킷 및 배치와 최대 메모리 양 해시 테이블에 사용됩니다. (배치 수가 1개를 초과하는 경우, 디스크 공간 사용량도 포함되지만 이는 그렇지 않습니다. 표시됩니다.)

또 다른 유형의 추가 정보는 행 수입니다 필터 조건에 의해 제거됨:

사설 토토 분석 선택 * FROM tenk1 WHERE ten < 7;

                                                쿼리 계획
---------------------------------------------------------------------------------------------
 tenk1의 Seq 스캔(비용=0.00..483.00 행=7000 너비=244)(실제 시간=0.111..59.249 행=7000 루프=1)
   필터: (10 < 7)
   필터에 의해 제거된 행: 3000
 총 런타임: 85.340ms

이러한 수는 필터에 특히 유용할 수 있습니다. 조인 노드에 적용되는 조건. 그만큼"행 제거됨"라인은 적어도 하나가 스캔되었을 때만 나타납니다 행 또는 조인 노드의 경우 잠재적인 조인 쌍은 다음과 같습니다. 필터 조건에 의해 거부되었습니다.

필터 조건과 유사한 경우가 발생합니다."손실"색인 스캔. 예를 들어, 다음을 고려해보세요 특정 지점을 포함하는 다각형 검색:

사설 토토 분석 선택 * FROM 다각형_tbl WHERE f1 @ 다각형 '(0.5,2.0)';

                                              쿼리 계획
----------------------------------------------------------------------------
 Polygon_tbl의 시퀀스 스캔(비용=0.00..1.05행=1 너비=32)(실제 시간=0.251..0.251행=0 루프=1)
   필터: (f1 @ '((0.5,2))'::폴리곤)
   필터에 의해 제거된 행: 4
 총 런타임: 0.517ms

기획자는 이 샘플 테이블이 (매우 정확하게) 생각합니다 인덱스 스캔을 수행하기에는 너무 작으므로 일반 정보가 있습니다. 모든 행이 거부되는 순차 스캔 필터 상태. 하지만 강제로 인덱스 스캔을 사용하게 되면 보다:

SET Enable_seqscan TO 끄기;

사설 토토 분석 선택 * FROM 폴리곤_tbl WHERE 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.054ms

여기서 색인이 하나의 후보 행을 반환한 것을 볼 수 있습니다. 그런 다음 인덱스 조건을 다시 확인하여 거부되었습니다. 이는 GiST 인덱스가 다음과 같기 때문에 발생합니다."손실"다각형 격리 테스트용: it 실제로는 폴리곤이 겹치는 행을 반환합니다. 그런 다음 대상에 대한 정확한 격리 테스트를 수행해야 합니다. 그 행.

사설 토토버퍼함께 사설 토토할 수 있는 옵션분석더 많은 런타임 통계를 얻으려면:

사설 토토(분석, 버퍼) SELECT * FROM tenk1 WHERE 고유1 < 100 AND 고유2  9000;

                                                            쿼리 계획
---------------------------------------------------------------------------------------------------------
 tenk1의 비트맵 힙 스캔(비용=25.07..60.23 행=10 너비=244)(실제 시간=3.069..3.213 행=10 루프=1)
   조건을 다시 확인하세요: ((unique1 < 100) AND (unique2  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)
               인덱스 조건: (unique2  9000)
               버퍼: 공유 적중=5
 총 런타임: 3.917ms

제공된 숫자버퍼쿼리의 어느 부분이 가장 많은지 식별하는 데 도움이 됩니다. I/O 집약적입니다.

이것을 명심하세요 왜냐하면사설 토토하세요 분석실제로 쿼리를 실행합니다. 모든 부작용은 쿼리 결과가 어떻든 간에 평소와 같이 발생합니다. 출력은 인쇄를 위해 폐기됩니다.사설 토토데이터. 분석하고 싶다면 테이블을 변경하지 않고도 데이터 수정 쿼리를 수행할 수 있습니다. 나중에 명령을 다시 실행하세요. 예를 들면 다음과 같습니다.

시작;

사설 토토 분석 업데이트 tenk1 SET 100 = 100 + 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)
         조건 재확인: (unique1 < 100)
         - tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.01 행=101 너비=0)(실제 시간=0.461..0.461 행=100 루프=1)
               지수 조건: (고유1 < 100)
 총 런타임: 81.922ms

롤백;

이 예에서 볼 수 있듯이 쿼리는 다음과 같습니다.삽입, 업데이트또는삭제명령, 실제 작업 테이블 변경 사항 적용은 최상위 수준 삽입에 의해 수행됩니다. 계획 노드를 업데이트하거나 삭제합니다. 이 아래의 계획 노드 노드는 이전 행을 찾는 작업 및/또는 계산을 수행합니다. 새로운 데이터. 위에서는 동일한 종류의 비트맵 테이블을 볼 수 있습니다. 우리가 이미 본 스캔과 그 출력은 업데이트에 공급됩니다. 업데이트된 행을 저장하는 노드입니다. 주목할 만한 점은 데이터 수정 노드에는 상당한 양의 시간이 소요될 수 있지만 런타임(여기서 시간의 가장 큰 부분을 차지함), 플래너는 현재 비용에 아무것도 추가하지 않습니다. 해당 작업을 사설 토토하기 위한 추정치입니다. 그 이유는 해야 할 일이 모든 올바른 쿼리 계획에 대해 수행되는 작업은 동일하므로 계획 결정에 영향을 미칩니다.

총 런타임표시자:분석 사설 토토실행자 포함 시작 및 종료 시간은 물론 실행 시간도 표시됩니다. 실행되는 트리거이지만 구문 분석은 포함되지 않습니다. 재작성 또는 계획 시간. 실행에 소요된 시간이전트리거가 있는 경우 시간에 포함됩니다. 관련 삽입, 업데이트 또는 삭제 노드의 경우 하지만 보낸 시간 실행 중이후트리거가 아님 거기에 계산된 이유는이후트리거 전체 계획이 완료된 후 해고됩니다. 총 시간 각 트리거에 소비됨(둘 중 하나)이전또는이후)도 별도로 표시됩니다. 지연된 제약 조건 트리거는 실행되지 않습니다. 거래가 끝날 때까지 전혀 표시되지 않습니다.분석 사설 토토.

14.1.3. 주의사항

런타임을 측정하는 두 가지 중요한 방법이 있습니다. 에 의해분석 사설 토토다음에서 벗어날 수 있음 동일한 쿼리의 정상적인 실행. 첫째, 출력 행이 없기 때문에 클라이언트에게 전달되며, 네트워크 전송 비용 및 I/O 전환 비용은 포함되지 않습니다. 둘째, 측정 오버헤드가 추가됨분석 사설 토토할 수 있다 특히 느린 컴퓨터에서는 중요합니다.gettimeofday()운영 체제 호출. 너 사설 토토할 수 있습니다.토토 : 문서 : 9.2 :측정 도구 시스템의 타이밍 오버헤드.

사설 토토결과는 다음과 같아서는 안 됩니다. 당신과 많이 다른 상황으로 추정됩니다. 실제로 테스트 중입니다. 예를 들어, 장난감 크기 테이블의 결과 큰 테이블에는 적용할 수 없다고 가정할 수 있습니다. 기획자의 비용 추정치는 선형적이지 않으므로 다른 값을 선택할 수도 있습니다. 더 크거나 작은 테이블을 계획하세요. 극단적인 예는 바로 하나의 디스크 페이지만 차지하는 테이블에서는 거의 인덱스가 사용 가능한지 여부에 관계없이 항상 순차 스캔 계획을 얻습니다. 아니면. 플래너는 디스크 하나가 필요하다는 것을 깨닫습니다. 어떤 경우에도 테이블을 처리하기 위해 페이지를 읽었으므로 값이 없습니다. 인덱스를 보기 위해 추가 페이지 읽기를 확장합니다. (우리는 보았다 이 일이 일어나는 것은polygon_tbl위의 예.)

실제값과 추정값이 일치하지 않는 경우가 있습니다. 잘 일치하지는 않지만 실제로 잘못된 것은 없습니다. 그러한 사례 중 하나 계획 노드 실행이 a에 의해 중단될 때 발생합니다.제한또는 유사한 효과. 예를 들어, 에서제한이전에 사용했던 쿼리

사설 토토 분석 선택 * FROM tenk1 여기서 고유1 < 100 AND 고유2  9000 제한 2;

                                                          쿼리 계획
-----------------------------------------------------------------------------------------------------
 제한(비용=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)
         인덱스 조건: (unique2  9000)
         필터: (고유1 < 100)
         필터에 의해 제거된 행: 287
 총 런타임: 2.857ms

인덱스 스캔 노드의 예상 비용 및 행 수는 다음과 같습니다. 마치 실행이 완료된 것처럼 표시됩니다. 그러나 실제로는 Limit 노드는 2개를 얻은 후 행 요청을 중지했습니다. 실제 행 개수는 2개에 불과하고 런타임은 비용 견적이 제안될 것입니다. 이는 추정 오류가 아니며, 추정치와 실제 값이 일치하지 않을 뿐입니다. 표시됩니다.

병합 조인에는 혼동을 일으킬 수 있는 측정 아티팩트도 있습니다. 부주의한. 병합 조인은 다음과 같은 경우 하나의 입력 읽기를 중지합니다. 다른 입력과 하나의 다음 키 값을 모두 사용했습니다. 입력이 다른 입력의 마지막 키 값보다 큽니다. ~에 그러한 경우 더 이상 일치하는 항목이 없으므로 스캔할 필요가 없습니다. 첫 번째 입력의 나머지 부분. 이로 인해 모든 내용을 읽지 못하게 됩니다. 한 아이, 위에서 언급한 것과 같은 결과를 얻었습니다.제한. 또한 외부(첫 번째) 하위 항목에 다음이 포함된 경우 중복된 키 값이 있는 행의 경우 내부(두 번째) 하위 항목은 다음과 같습니다. 일치하는 행 부분을 백업하고 다시 검색했습니다. 해당 키 값입니다.분석 사설 토토개수 마치 동일한 내부 행이 반복적으로 방출되는 것처럼 실제 추가 행. 외부 중복이 많은 경우 내부 하위 계획 노드에 대해 보고된 실제 행 수는 다음과 같습니다. 실제 행 수보다 훨씬 더 많습니다. 내부 관계에서.

BitmapAnd 및 BitmapOr 노드는 항상 실제 행을 보고합니다. 구현 제한으로 인해 0으로 계산됩니다.