토토 사이트 #포스트그레SQLa를 고안쿼리 계획수신하는 각 쿼리에 대해. 쿼리 구조와 데이터 속성을 일치시키는 올바른 계획을 선택하는 것은 좋은 성능을 위해 절대적으로 중요하므로 시스템에는 복잡한플래너좋은 계획을 선택하려고 노력합니다. 다음을 사용할 수 있습니다.토토 사이트플래너가 쿼리에 대해 어떤 쿼리 계획을 생성하는지 확인하는 명령입니다. 계획 읽기는 숙달하려면 약간의 경험이 필요한 기술이지만, 이 섹션에서는 기본 사항을 다루려고 합니다.
이 섹션의 예는 다음을 수행한 후 회귀 테스트 데이터베이스에서 추출되었습니다.진공 분석, v18 개발 소스 사용. 예제를 직접 시도해 보면 비슷한 결과를 얻을 수 있지만 예상 비용과 행 개수는 다음과 같은 이유로 약간 다를 수 있습니다.분석의 통계는 정확하지 않고 무작위 샘플이며 비용은 본질적으로 플랫폼에 따라 다소 다르기 때문입니다.
예시 사용토토 사이트의 기본값“텍스트”사람이 읽기에 작고 편리한 출력 형식입니다. 먹이를 주고 싶다면토토 사이트11954_12088
토토 사이트기본사항#쿼리 계획의 구조는 트리입니다.계획 노드. 트리의 맨 아래 수준에 있는 노드는 스캔 노드입니다. 즉, 테이블의 원시 행을 반환합니다. 다양한 테이블 액세스 방법에 대해 다양한 유형의 스캔 노드가 있습니다(순차 스캔, 인덱스 스캔, 비트맵 인덱스 스캔). 다음과 같은 테이블이 아닌 행 소스도 있습니다.값절 및 집합 반환 함수발신은 고유한 스캔 노드 유형을 가지고 있습니다. 쿼리에 원시 행에 대한 조인, 집계, 정렬 또는 기타 작업이 필요한 경우 이러한 작업을 수행하기 위해 스캔 노드 위에 추가 노드가 있습니다. 다시 말하지만 일반적으로 이러한 작업을 수행하는 방법은 여러 가지가 있으므로 여기에도 다양한 노드 유형이 나타날 수 있습니다. 의 출력토토 사이트에는 계획 트리의 각 노드에 대해 한 줄이 있으며, 기본 노드 유형과 계획자가 해당 계획 노드 실행을 위해 작성한 예상 비용을 보여줍니다. 노드의 추가 속성을 표시하기 위해 노드의 요약 줄에서 들여쓰기된 추가 줄이 나타날 수 있습니다. 첫 번째 줄(최상위 노드에 대한 요약 줄)에는 계획에 대한 예상 총 실행 비용이 있습니다. 기획자가 최소화하려고 하는 것이 바로 이 숫자입니다.
다음은 출력이 어떻게 보이는지 보여주기 위한 간단한 예입니다.
토토 사이트 선택 * FROM tenk1;
쿼리 계획
------------------------------------------------
tenk1의 시퀀스 스캔(비용=0.00..445.00행=10000너비=244)
이 쿼리에는 다음이 없으므로어디절, 테이블의 모든 행을 스캔해야 하므로 플래너는 간단한 순차 스캔 계획을 사용하기로 선택했습니다. 괄호 안에 인용된 숫자는 (왼쪽에서 오른쪽으로):
예상 시작 비용. 이는 출력 단계가 시작되기 전에 소비된 시간입니다(예: 정렬 노드에서 정렬을 수행하는 시간).
예상 총 비용. 이는 계획 노드가 완료될 때까지 실행된다는 가정, 즉 사용 가능한 모든 행이 검색된다는 가정에 따라 토토 사이트됩니다. 실제로 노드의 상위 노드는 사용 가능한 모든 행을 읽지 못하고 중지될 수 있습니다(한도아래 예).
이 계획 노드에 의해 출력된 예상 행 수입니다. 다시 말하지만, 노드는 완료될 때까지 실행되는 것으로 가정됩니다.
이 계획 노드에 의해 출력된 행의 예상 평균 너비(바이트).
비용은 계획자의 비용 매개변수에 따라 결정된 임의의 단위로 측정됩니다(참조섹션 19.7.2). 전통적인 방식은 디스크 페이지 가져오기 단위로 비용을 측정하는 것입니다. 즉,seq_page_cost일반적으로 다음과 같이 설정됩니다.1.0그리고 다른 비용 매개변수는 이에 맞춰 설정됩니다. 이 섹션의 예시는 기본 비용 매개변수를 사용하여 실행됩니다.
상위 노드의 비용에는 모든 하위 노드의 비용이 포함된다는 점을 이해하는 것이 중요합니다. 비용에는 기획자가 관심을 두는 사항만 반영된다는 점을 인식하는 것도 중요합니다. 특히, 출력 값을 텍스트 형식으로 변환하거나 클라이언트에 전송하는 데 소요되는 시간은 비용에 고려되지 않으며, 이는 실제 경과 시간에 중요한 요소가 될 수 있습니다. 그러나 기획자는 계획을 변경해도 비용을 변경할 수 없기 때문에 해당 비용을 무시합니다. (모든 올바른 계획은 동일한 행 집합을 출력할 것이라고 믿습니다.)
그행값은 계획 노드에서 처리하거나 스캔한 행 수가 아니라 노드에서 내보낸 행 수이기 때문에 약간 까다롭습니다. 이는 필터링 결과로 스캔된 숫자보다 적은 경우가 많습니다.어디-노드에 적용되는 절 조건입니다. 이상적으로 최상위 행 추정치는 쿼리에 의해 실제로 반환, 업데이트 또는 삭제된 행 수와 비슷합니다.
예로 돌아가기:
토토 사이트 선택 * FROM tenk1;
쿼리 계획
------------------------------------------------
tenk1의 시퀀스 스캔(비용=0.00..445.00행=10000너비=244)
이 숫자는 매우 간단하게 파생됩니다. 그렇게 한다면:
pg_class WHERE relname = 'tenk1'에서 relpages, reltuples 선택;
당신은 그것을 발견할 것입니다텐크1에는 345개의 디스크 페이지와 10000개의 행이 있습니다. 예상 비용은 다음과 같이 계산됩니다(읽은 디스크 페이지 *seq_page_cost) + (스캔된 행 *cpu_tuple_cost). 기본적으로,seq_page_cost1.0이고cpu_tuple_cost은 0.01이므로 예상 비용은 (345 * 1.0) + (10000 * 0.01) = 445입니다.
이제 쿼리를 수정하여 다음을 추가하겠습니다.어디조건:
토토 사이트 선택 * FROM tenk1 WHERE 고유1 < 7000;
쿼리 계획
----------------------------------
tenk1의 시퀀스 스캔(비용=0.00..470.00행=7000너비=244)
필터: (고유1 < 7000)
다음에 주의하세요.토토 사이트출력에 다음이 표시됩니다.어디다음으로 적용되는 절“필터”조건이 Seq 스캔 계획 노드에 연결되었습니다. 이는 계획 노드가 스캔하는 각 행의 조건을 확인하고 조건을 통과하는 행만 출력한다는 의미입니다. 출력 행의 추정치는 다음으로 인해 감소되었습니다.어디절. 그러나 스캔은 여전히 10000개 행을 모두 방문해야 하므로 비용은 줄어들지 않습니다. 실제로는 조금 올랐습니다(10000 *cpu_operator_cost, 정확하게는) 확인에 소요된 추가 CPU 시간을 반영합니다.어디조건.
이 쿼리가 선택하는 실제 행 수는 7000개이지만,행추정치는 대략적인 수치일 뿐입니다. 이 실험을 복제하려고 하면 약간 다른 추정치를 얻을 수 있습니다. 또한 매번 변경될 수 있습니다.분석명령, 왜냐하면 통계는분석테이블의 무작위 샘플에서 가져옵니다.
이제 조건을 더욱 제한적으로 만들어 보겠습니다.
토토 사이트 선택 * FROM tenk1 WHERE 고유1 < 100;
쿼리 계획
-----------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=5.06..224.98 행=100 너비=244)
조건 재확인: (unique1 < 100)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)
인덱스 조건: (unique1 < 100)
여기서 플래너는 2단계 계획을 사용하기로 결정했습니다. 하위 계획 노드는 인덱스를 방문하여 인덱스 조건과 일치하는 행의 위치를 찾은 다음 상위 계획 노드가 실제로 테이블 자체에서 해당 행을 가져옵니다. 행을 개별적으로 가져오는 것은 순차적으로 읽는 것보다 훨씬 더 비싸지만 테이블의 모든 페이지를 방문할 필요는 없기 때문에 순차 스캔보다 여전히 저렴합니다. (두 가지 계획 수준을 사용하는 이유는 상위 계획 노드가 인덱스로 식별된 행 위치를 물리적인 순서로 정렬한 후 읽기 전에 별도의 가져오기 비용을 최소화하기 때문입니다.“비트맵”노드 이름에 언급된 것은 정렬을 수행하는 메커니즘입니다.)
이제 다른 조건을 추가하겠습니다어디절:
토토 사이트 선택 * FROM tenk1 WHERE Unique1 < 100 AND stringu1 = 'xxx';
쿼리 계획
-----------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=5.04..225.20행=1 너비=244)
조건 재확인: (unique1 < 100)
필터: (stringu1 = 'xxx'::name)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)
인덱스 조건: (unique1 < 100)
추가된 조건stringu1 = 'xxx'은 출력 행 수 추정치를 줄이지만 여전히 동일한 행 집합을 방문해야 하기 때문에 비용은 줄지 않습니다. 그 이유는stringu1절은 인덱스 조건으로 적용될 수 없습니다. 이 인덱스는 다음에만 있기 때문입니다.고유1열. 대신 인덱스를 사용하여 검색된 행에 필터로 적용됩니다. 따라서 이 추가 확인을 반영하여 실제로 비용이 약간 증가했습니다.
어떤 경우에는 기획자가 다음을 선호할 것입니다.“간단한”색인 스캔 계획:
토토 사이트 선택 * FROM tenk1 WHERE 고유1 = 42;
쿼리 계획
--------------------------------------------------------------
tenk1에서 tenk1_unique1을 사용하는 인덱스 스캔(비용=0.29..8.30행=1너비=244)
인덱스 조건: (unique1 = 42)
이 유형의 계획에서는 테이블 행을 색인 순서로 가져오므로 읽기 비용이 더 많이 들지만 행 위치를 정렬하는 추가 비용이 너무 적기 때문에 가치가 없습니다. 단일 행만 가져오는 쿼리에 대해 이 계획 유형을 가장 자주 볼 수 있습니다. 또한 다음이 있는 쿼리에도 자주 사용됩니다.주문 기준인덱스 순서와 일치하는 조건. 그 이유는 다음을 만족시키기 위해 추가 정렬 단계가 필요하지 않기 때문입니다.주문 기준. 이 예에서는 다음을 추가합니다.순서별 고유1인덱스가 이미 암시적으로 요청된 순서를 제공하기 때문에 동일한 계획을 사용합니다.
계획자는 다음을 구현할 수 있습니다.주문 기준절을 여러 가지 방법으로 사용할 수 있습니다. 위의 예는 그러한 순서 지정 절이 암시적으로 구현될 수 있음을 보여줍니다. 기획자는 명시적인 내용을 추가할 수도 있습니다.정렬단계:
EXPLAIN SELECT * FROM tenk1 ORDER BY 고유1;
쿼리 계획
-----------------------------------------
정렬(비용=1109.39..1134.39행=10000 너비=244)
정렬 키: 고유1
- tenk1의 시퀀스 스캔(비용=0.00..445.00행=10000너비=244)
계획의 일부가 필요한 정렬 키의 접두사 순서를 보장하는 경우 계획자는 대신 다음을 사용하기로 결정할 수 있습니다.증분 정렬단계:
EXPLAIN SELECT * FROM tenk1 ORDER BY 백, 십 LIMIT 100;
쿼리 계획
-------------------------------------------------------------------
제한(비용=19.35..39.49행=100너비=244)
- 증분 정렬(비용=19.35..2033.39행=10000너비=244)
정렬 키: 백, 십
사전 정렬된 키: 100
- tenk1에서 tenk1_hundred를 사용한 인덱스 스캔(비용=0.29..1574.20 행=10000 너비=244)
일반 정렬과 비교하여 증분 정렬을 사용하면 전체 결과 집합이 정렬되기 전에 튜플을 반환할 수 있으며 특히 다음과 같은 최적화가 가능합니다.제한쿼리. 또한 메모리 사용량과 정렬이 디스크로 유출될 가능성을 줄일 수 있지만 결과 집합을 여러 정렬 일괄 처리로 분할하는 데 따른 오버헤드가 증가합니다.
에서 참조된 여러 열에 별도의 색인이 있는 경우어디, 플래너는 인덱스의 AND 또는 OR 조합을 사용하도록 선택할 수 있습니다.
토토 사이트 선택 * FROM tenk1 여기서 고유1 < 100 AND 고유2 9000;
쿼리 계획
------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=25.07..60.11행=10너비=244)
조건을 다시 확인하세요: ((unique1 < 100) AND (unique2 9000))
- BitmapAnd(비용=25.07..25.07행=10너비=0)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)
지수 조건: (고유1 < 100)
- tenk1_unique2의 비트맵 인덱스 스캔(비용=0.00..19.78행=999너비=0)
지수 조건: (unique2 9000)
그러나 이를 위해서는 두 인덱스를 모두 방문해야 하므로 하나의 인덱스만 사용하고 다른 조건을 필터로 처리하는 것에 비해 반드시 승리하는 것은 아닙니다. 관련된 범위를 변경하면 그에 따라 계획이 변경되는 것을 볼 수 있습니다.
다음은 효과를 보여주는 예입니다제한:
토토 사이트 선택 * FROM tenk1 WHERE 고유1 < 100 AND 고유2 9000 LIMIT 2;
쿼리 계획
------------------------------------------------------------
제한(비용=0.29..14.28행=2너비=244)
- tenk1에서 tenk1_unique2를 사용한 인덱스 스캔(비용=0.29..70.27행=10너비=244)
인덱스 조건: (unique2 9000)
필터: (고유1 < 100)
이것은 위와 동일한 쿼리이지만 다음을 추가했습니다.제한그래서 모든 행을 검색할 필요는 없으며 플래너는 무엇을 해야할지에 대한 마음을 바꿨습니다. Index Scan 노드의 총 비용과 행 수가 실행이 완료된 것처럼 표시됩니다. 그러나 Limit 노드는 해당 행의 5분의 1만 검색한 후에 중지될 것으로 예상되므로 총 비용은 5분의 1에 불과하며 이것이 쿼리의 실제 예상 비용입니다. 이 계획은 이전 계획에 Limit 노드를 추가하는 것보다 선호됩니다. 왜냐하면 Limit은 비트맵 스캔의 시작 비용 지불을 피할 수 없으므로 이 접근 방식을 사용하면 총 비용이 25단위 이상이 되기 때문입니다.
우리가 논의한 열을 사용하여 두 테이블을 조인해 보겠습니다.
토토 사이트 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 10 AND t1.unique2 = t2.unique2;
쿼리 계획
------------------------------------------------------------
중첩 루프(비용=4.65..118.50행=10너비=488)
- tenk1 t1의 비트맵 힙 스캔(비용=4.36..39.38 행=10 너비=244)
조건 재확인: (unique1 < 10)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..4.36행=10너비=0)
지수 조건: (고유1 < 10)
- tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔(비용=0.29..7.90 행=1 너비=244)
인덱스 조건: (unique2 = t1.unique2)
이 계획에는 두 개의 테이블 스캔을 입력 또는 하위로 포함하는 중첩 루프 조인 노드가 있습니다. 노드 요약 줄의 들여쓰기는 계획 트리 구조를 반영합니다. 조인이 첫 번째이거나“외부”, child는 이전에 본 것과 유사한 비트맵 스캔입니다. 비용과 행 개수는 우리가 얻은 것과 동일합니다.SELECT ... WHERE 고유1 < 10우리는 다음을 적용하고 있기 때문에어디절고유1 < 10그 노드에서. 그만큼t1.unique2 = t2.unique2절은 아직 관련이 없으므로 외부 스캔의 행 수에 영향을 주지 않습니다. 중첩 루프 조인 노드는 두 번째를 실행합니다. 또는“내부”자식은 외부 하위에서 얻은 각 행에 대해 한 번입니다. 현재 외부 행의 열 값을 내부 스캔에 연결할 수 있습니다. 여기,t1.unique2바깥쪽 행의 값을 사용할 수 있으므로 위에서 본 것과 유사한 계획과 비용을 얻습니다.선택 ... 어디서 t2.unique2 =사건. (반복적인 인덱스 스캔 중에 발생할 것으로 예상되는 캐싱의 결과로 예상 비용은 위에서 본 것보다 실제로 약간 낮습니다.상수t2.) 그런 다음 루프 노드의 비용은 외부 스캔 비용, 각 외부 행(여기서는 10 * 7.90)에 대한 내부 스캔 1회 반복, 조인 처리를 위한 약간의 CPU 시간을 기준으로 설정됩니다.
이 예에서 조인의 출력 행 개수는 두 스캔의 행 개수의 곱과 동일하지만 추가 항목이 있을 수 있으므로 모든 경우에 해당되는 것은 아닙니다.어디절은 두 테이블을 모두 언급하므로 두 입력 스캔이 아닌 조인 포인트에만 적용될 수 있습니다. 예를 들면 다음과 같습니다.
토토 사이트 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 10 AND t2.unique2 < 10 AND t1.hundred < t2.hundred;
쿼리 계획
----------------------------------------------------------------
중첩 루프(비용=4.65..49.36행=33너비=488)
조인 필터: (t1.hundred < t2.hundred)
- tenk1 t1의 비트맵 힙 스캔(비용=4.36..39.38 행=10 너비=244)
조건 재확인: (unique1 < 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)
지수 조건: (unique2 < 10)
조건t1.백 < t2.백에서는 테스트할 수 없습니다.tenk2_unique2색인이므로 조인 노드에 적용됩니다. 이렇게 하면 조인 노드의 예상 출력 행 수가 줄어들지만 입력 스캔은 변경되지 않습니다.
여기서 기획자는 다음을 선택했습니다.“구현하다”조인의 내부 관계, 그 위에 Materialise 계획 노드를 배치합니다. 이는 다음을 의미합니다.t2중첩 루프 조인 노드가 외부 관계의 각 행에 대해 한 번씩 해당 데이터를 10번 읽어야 하더라도 인덱스 스캔은 한 번만 수행됩니다. Materialize 노드는 데이터를 읽을 때 메모리에 저장한 다음 각 후속 패스에서 메모리의 데이터를 반환합니다.
외부 조인을 처리할 때 두 가지가 모두 포함된 조인 계획 노드를 볼 수 있습니다.“조인 필터”그리고 일반“필터”조건이 첨부되었습니다. 조인 필터 조건은 외부 조인에서 나옵니다.켜짐절이므로 조인 필터 조건에 실패한 행은 여전히 null 확장 행으로 내보내질 수 있습니다. 그러나 일반 필터 조건은 외부 조인 규칙 뒤에 적용되므로 무조건 행을 제거하는 역할을 합니다. 내부 조인에서는 이러한 유형의 필터 간에 의미상 차이가 없습니다.
쿼리의 선택성을 약간 변경하면 매우 다른 조인 계획을 얻을 수 있습니다.
토토 사이트 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2;
쿼리 계획
----------------------------------------------------------------
해시 조인(비용=226.23..709.73행=100 너비=488)
해시 조건: (t2.unique2 = t1.unique2)
- tenk2 t2의 시퀀스 스캔(비용=0.00..445.00 행=10000 너비=244)
- 해시(비용=224.98..224.98 행=100 너비=244)
- tenk1 t1의 비트맵 힙 스캔(비용=5.06..224.98 행=100 너비=244)
조건 재확인: (unique1 < 100)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)
인덱스 조건: (unique1 < 100)
여기서 플래너는 해시 조인을 사용하기로 선택했습니다. 이 방식에서는 한 테이블의 행이 메모리 내 해시 테이블에 입력된 후 다른 테이블이 스캔되고 해시 테이블이 각 행과 일치하는지 조사됩니다. 들여쓰기가 계획 구조를 어떻게 반영하는지 다시 한 번 주목하세요: 비트맵 스캔 온tenk1은 해시 테이블을 구성하는 해시 노드에 대한 입력입니다. 그런 다음 Hash Join 노드로 반환되어 외부 하위 계획에서 행을 읽고 해시 테이블에서 각 항목을 검색합니다.
또 다른 가능한 조인 유형은 병합 조인입니다. 여기에 토토 사이트되어 있습니다.
토토 사이트 선택 *
tenk1 t1, onek t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2;
쿼리 계획
----------------------------------------------------------------
병합 조인(비용=0.56..233.49행=10너비=488)
조건 병합: (t1.unique2 = t2.unique2)
- tenk1 t1에서 tenk1_unique2를 사용한 인덱스 스캔(비용=0.29..643.28 행=100 너비=244)
필터: (고유1 < 100)
- onek t2에서 onek_unique2를 사용한 인덱스 스캔(비용=0.28..166.28 행=1000 너비=244)
병합 조인은 조인 키에 따라 입력 데이터를 정렬해야 합니다. 이 예에서 각 입력은 올바른 순서로 행을 방문하기 위해 인덱스 스캔을 사용하여 정렬됩니다. 그러나 순차적 스캔 및 정렬도 사용할 수 있습니다. (순차 스캔 및 정렬은 인덱스 스캔에 필요한 비순차적 디스크 액세스로 인해 많은 행을 정렬할 때 인덱스 스캔보다 자주 능가합니다.)
변형 계획을 보는 한 가지 방법은 다음에 토토 사이트된 활성화/비활성화 플래그를 사용하여 가장 저렴하다고 생각되는 전략을 무시하도록 플래너를 강제하는 것입니다.섹션 19.7.1. (이것은 조잡한 도구이지만 유용합니다. 또한 참조하십시오.롤 토토 : 문서 : 개발 : 14.3. 명백한 조인 조항으로 플래너 제어.) 예를 들어 이전 예에서 병합 조인이 가장 좋은 조인 유형인지 확신할 수 없다면 시도해 볼 수 있습니다.
SET 활성화_mergejoin = 꺼짐;
토토 사이트 선택 *
tenk1 t1, onek t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2;
쿼리 계획
----------------------------------------------------------------
해시 조인(비용=226.23..344.08행=10너비=488)
해시 조건: (t2.unique2 = t1.unique2)
- onek t2의 시퀀스 스캔(비용=0.00..114.00 행=1000 너비=244)
- 해시(비용=224.98..224.98 행=100 너비=244)
- tenk1 t1의 비트맵 힙 스캔(비용=5.06..224.98 행=100 너비=244)
조건 재확인: (unique1 < 100)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)
인덱스 조건: (unique1 < 100)
이는 플래너가 이 경우 해시 조인이 병합 조인보다 거의 50% 더 비싸다고 생각한다는 것을 보여줍니다. 물론 그 다음 질문은 그것이 맞는지 여부이다. 우리는 다음을 사용하여 조사할 수 있습니다.분석 토토 사이트, 논의한 대로아래.
계획 노드 유형을 비활성화하기 위해 활성화/비활성화 플래그를 사용할 때, 많은 플래그는 해당 계획 노드의 사용을 방해할 뿐이며 계획 노드 유형을 사용하는 계획자의 능력을 완전히 금지하지는 않습니다. 이는 플래너가 주어진 쿼리에 대한 계획을 수립하는 기능을 계속 유지하도록 의도적으로 설계된 것입니다. 결과 계획에 비활성화된 노드가 포함된 경우,토토 사이트출력에 이 사실이 표시됩니다.
SET 활성화_seqscan = 꺼짐;
EXPLAIN SELECT * FROM 유닛;
쿼리 계획
-------------------------------
단위의 시퀀스 스캔(비용=0.00..21.30행=1130너비=44)
비활성화됨: 사실
왜냐하면단위테이블에 인덱스가 없고 테이블 데이터를 읽을 수 있는 다른 방법이 없으므로 순차 스캔이 쿼리 플래너에서 사용할 수 있는 유일한 옵션입니다.
일부 쿼리 계획에는 다음이 포함됩니다.하위 계획, sub-에서 발생선택s는 원래 쿼리에 있습니다. 이러한 쿼리는 때때로 일반 조인 계획으로 변환될 수 있지만, 그렇게 할 수 없는 경우 다음과 같은 계획을 얻습니다.
자세한 토토 사이트 고유 선택1
tenk1t에서
WHERE t.ten < ALL (onek o WHERE o.four = t.4에서 o.ten 선택);
쿼리 계획
------------------------------------------------------------
public.tenk1 t의 Seq 스캔(비용=0.00..586095.00 행=5000 너비=4)
출력: t.unique1
필터: (ALL (t.ten < (SubPlan 1).col1))
하위 계획 1
- public.onek o의 시퀀스 스캔(비용=0.00..116.50행=250너비=4)
출력: 0.10
필터: (o.four = t.four)
이 다소 인위적인 예는 몇 가지 요점을 토토 사이트하는 역할을 합니다. 외부 계획 수준의 값은 하위 계획으로 전달될 수 있습니다(여기서,t.four이 전달됨) 하위 선택의 결과는 외부 계획에 사용할 수 있습니다. 해당 결과 값은 다음과 같이 표시됩니다.토토 사이트다음과 같은 표기법 포함(, 이는 다음을 나타냅니다.하위 계획_이름).colNN'하위-의 출력 열선택.
위의 예에서,전체연산자는 외부 쿼리의 각 행에 대해 하위 계획을 다시 실행합니다(높은 예상 비용을 토토 사이트함). 일부 쿼리는 a를 사용할 수 있습니다.해시된 하위 계획이를 방지하려면:
토토 사이트 선택 *
tenk1t에서
WHERE t.unique1 NOT IN (SELECT o.unique1 FROM onek o);
쿼리 계획
-------------------------------------------------------------------------------
Tenk1 t의 Seq 스캔(비용=61.77..531.77행=5000너비=244)
필터: (NOT (ANY (unique1 = (해시된 SubPlan 1).col1)))
하위 계획 1
- onek o에서 onek_unique1을 사용하여 인덱스 전용 스캔(비용=0.28..59.27행=1000 너비=4)
(4행)
여기서 하위 계획은 한 번 실행되고 그 출력은 메모리 내 해시 테이블에 로드된 다음 외부에 의해 조사됩니다.모두연산자. 이를 위해서는 하위-선택외부 쿼리의 어떤 변수도 참조하지 않으며, 그모두의 비교 연산자는 해싱이 가능합니다.
외부 쿼리의 변수를 참조하지 않는 것 외에도 하위-선택둘 이상의 행을 반환할 수 없으며 대신 다음과 같이 구현될 수 있습니다.초기 계획:
자세한 토토 사이트 고유 선택1
FROM tenk1 t1 WHERE t1.ten = (SELECT (random() * 10)::integer);
쿼리 계획
--------------------------------------------------------
public.tenk1 t1의 시퀀스 스캔(비용=0.02..470.02행=1000 너비=4)
출력: t1.unique1
필터: (t1.ten = (InitPlan 1).col1)
초기화 계획 1
- 결과(비용=0.00..0.02행=1너비=4)
출력: ((random() * '10'::배정밀도))::integer
initplan은 외부 계획 실행마다 한 번만 실행되며 그 결과는 외부 계획의 이후 행에서 재사용하기 위해 저장됩니다. 따라서 이 예에서는무작위()한 번만 평가되며 모든 값t1.ten동일하게 무작위로 선택된 정수와 비교됩니다. 이는 하위가 없는 경우와는 상당히 다릅니다.선택구조물.
분석 토토 사이트 #다음을 사용하여 기획자의 추정의 정확성을 확인할 수 있습니다.토토 사이트의분석옵션. 이 옵션을 사용하면,토토 사이트실제로 쿼리를 실행한 다음 일반 노드와 동일한 추정치와 함께 각 계획 노드 내에 누적된 실제 행 수와 실제 런타임을 표시합니다.토토 사이트표시됩니다. 예를 들어 다음과 같은 결과를 얻을 수 있습니다.
토토 사이트 분석 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 10 AND t1.unique2 = t2.unique2;
쿼리 계획
--------------------------------------------------------------------------------------------------------------------
중첩 루프(비용=4.65..118.50행=10 너비=488) (실제 시간=0.017..0.051행=10.00 루프=1)
버퍼: 공유 적중=36 읽기=6
- tenk1 t1의 비트맵 힙 스캔(비용=4.36..39.38행=10 너비=244)(실제 시간=0.009..0.017행=10.00 루프=1)
조건 재확인: (unique1 < 10)
힙 블록: 정확=10
버퍼: 공유 적중=3 읽기=5 쓰기=4
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..4.36행=10 너비=0)(실제 시간=0.004..0.004행=10.00 루프=1)
지수 조건: (고유1 < 10)
인덱스 검색: 1
버퍼: 공유 적중=2
- tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔(비용=0.29..7.90 행=1 너비=244) (실제 시간=0.003..0.003 행=1.00 루프=10)
인덱스 조건: (unique2 = t1.unique2)
인덱스 검색: 10
버퍼: 공유 적중=24 읽기=6
계획:
버퍼: 공유 적중=15 더럽혀짐=9
계획 시간: 0.485ms
실행 시간: 0.073ms
참고하세요“실제 시간”값은 실시간의 밀리초 단위인 반면,비용추정치는 임의의 단위로 표현됩니다. 그래서 그들은 일치하지 않을 것 같습니다. 일반적으로 찾아야 할 가장 중요한 것은 예상 행 수가 현실에 가까운지 여부입니다. 이 예에서는 추정치가 모두 틀렸지만 실제로는 매우 이례적입니다.
일부 쿼리 계획에서는 하위 계획 노드가 두 번 이상 실행될 수 있습니다. 예를 들어, 내부 인덱스 스캔은 위의 중첩 루프 계획에서 외부 행당 한 번씩 실행됩니다. 그러한 경우에는루프값은 노드의 총 실행 수를 보고하며 표시된 실제 시간 및 행 값은 실행당 평균입니다. 이는 비용 추정이 표시되는 방식과 숫자를 비교할 수 있도록 하기 위해 수행됩니다. 를 곱한다루프값은 노드에서 실제로 소요된 총 시간을 가져옵니다. 위의 예에서는 인덱스 스캔을 실행하는 데 총 0.030밀리초가 소요되었습니다.tenk2.
어떤 경우에는분석 토토 사이트계획 노드 실행 시간 및 행 수 이외의 추가 실행 통계를 표시합니다. 예를 들어 Sort 및 Hash 노드는 추가 정보를 제공합니다.
토토 사이트 분석 선택 *
tenk1 t1, tenk2 t2에서
t1.unique1 < 100 AND t1.unique2 = t2.unique2 ORDER BY t1.fivethous;
쿼리 계획
------------------------------------------------------------------------------------------------------------------
정렬(비용=713.05..713.30 행=100 너비=488) (실제 시간=2.995..3.002 행=100.00 루프=1)
정렬 키: t1.fivethous
정렬 방법: 퀵소트 메모리: 74kB
버퍼: 공유 히트=440
- 해시 조인(비용=226.23..709.73 행=100 너비=488) (실제 시간=0.515..2.920 행=100.00 루프=1)
해시 조건: (t2.unique2 = t1.unique2)
버퍼: 공유 히트=437
- tenk2 t2의 Seq 스캔(비용=0.00..445.00 행=10000 너비=244)(실제 시간=0.026..1.790 행=10000.00 루프=1)
버퍼: 공유 히트=345
- 해시(비용=224.98..224.98 행=100 너비=244) (실제 시간=0.476..0.477 행=100.00 루프=1)
버킷: 1024 배치: 1 메모리 사용량: 35kB
버퍼: 공유 히트=92
- tenk1 t1의 비트맵 힙 스캔(비용=5.06..224.98행=100 너비=244)(실제 시간=0.030..0.450행=100.00 루프=1)
조건 재확인: (unique1 < 100)
힙 블록: 정확=90
버퍼: 공유 히트=92
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)(실제 시간=0.013..0.013행=100.00 루프=1)
지수 조건: (고유1 < 100)
인덱스 검색: 1
버퍼: 공유 적중=2
계획:
버퍼: 공유 적중=12
계획 시간: 0.187ms
실행 시간: 3.036ms
정렬 노드는 사용된 정렬 방법(특히 정렬이 메모리 내 또는 디스크 내 정렬인지 여부)과 필요한 메모리 양 또는 디스크 공간을 표시합니다. 해시 노드에는 해시 버킷 및 배치 수와 해시 테이블에 사용된 최대 메모리 양이 표시됩니다. (배치 수가 1개를 초과하면 디스크 공간 사용량도 포함되지만 표시되지 않습니다.)
인덱스 스캔 노드(비트맵 인덱스 스캔 및 인덱스 전용 스캔 노드 포함)는 다음을 표시합니다.“색인 검색”전체 검색 횟수를 보고하는 라인전체노드 실행/루프:
토토 사이트 분석 선택 * FROM tenk1 WHERE 1000 IN (1, 500, 700, 999);
쿼리 계획
--------------------------------------------------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=9.45..73.44행=40 너비=244)(실제 시간=0.012..0.028행=40.00 루프=1)
조건을 다시 확인하세요: (thousand = ANY ('1,500,700,999'::integer[]))
힙 블록: 정확=39
버퍼: 공유 히트=47
- tenk1_thous_tenthous의 비트맵 인덱스 스캔(비용=0.00..9.44행=40 너비=0)(실제 시간=0.009..0.009행=40.00 루프=1)
인덱스 조건: (천 = ANY ('1,500,700,999'::integer[]))
색인 검색: 4
버퍼: 공유 적중=8
계획 시간: 0.029ms
실행 시간: 0.034ms
여기서 우리는 4개의 별도 인덱스 검색이 필요한 비트맵 인덱스 스캔 노드를 봅니다. 스캔은 다음에서 인덱스를 검색해야 했습니다.tenk1_thous_tenthous색인 루트 페이지당 한 번정수술어의 값IN구조물. 그러나 인덱스 검색 수는 쿼리 조건자와 이렇게 간단하게 일치하지 않는 경우가 많습니다.
토토 사이트 분석 선택 * FROM tenk1 WHERE 1000 IN (1, 2, 3, 4);
쿼리 계획
--------------------------------------------------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=9.45..73.44행=40 너비=244)(실제 시간=0.009..0.019행=40.00 루프=1)
조건을 다시 확인하세요: (thousand = ANY ('1,2,3,4'::integer[]))
힙 블록: 정확=38
버퍼: 공유 히트=40
- tenk1_thous_tenthous에서 비트맵 인덱스 스캔(비용=0.00..9.44행=40 너비=0)(실제 시간=0.005..0.005행=40.00 루프=1)
인덱스 조건: (천 = ANY ('1,2,3,4'::integer[]))
인덱스 검색: 1
버퍼: 공유 적중=2
계획 시간: 0.029ms
실행 시간: 0.026ms
이 변형은 우리의IN쿼리가 1개의 색인 검색만 수행했습니다. 원래 쿼리와 비교하여 인덱스를 탐색하는 데 소요되는 시간은 다음과 같습니다.IN구성은 같은 위치에 서로 옆에 저장된 인덱스 튜플과 일치하는 값을 사용합니다.tenk1_thous_tenthous인덱스 리프 페이지.
그“색인 검색”line은 다음을 적용하는 B-트리 인덱스 스캔에도 유용합니다.스킵 스캔색인을 더욱 효율적으로 탐색하기 위한 최적화:
토토 사이트 분석 4개, 고유1을 tenk1에서 선택하세요. 여기서 4개는 1과 3 사이이고 고유1 = 42입니다.
쿼리 계획
--------------------------------------------------------------------------------------------------------
tenk1에서 tenk1_four_unique1_idx를 사용하여 인덱스 전용 스캔(비용=0.29..6.90 행=1 너비=8)(실제 시간=0.006..0.007 행=1.00 루프=1)
지수 조건: ((4 = 1) AND (4 <= 3) AND (unique1 = 42))
힙 페치: 0
인덱스 검색: 3
버퍼: 공유 적중=7
계획 시간: 0.029ms
실행 시간: 0.012ms
여기서 우리는 다음을 사용하는 Index-Only Scan 노드를 봅니다.tenk1_four_unique1_idx, 의 다중 열 색인tenk1테이블의4그리고고유1열. 스캔은 각각 단일 인덱스 리프 페이지를 읽는 3개의 검색을 수행합니다.“4 = 1 AND 고유1 = 42”, “4 = 2 AND 고유1 = 42”및“4 = 3 AND 고유1 = 42”. 이 인덱스는 일반적으로 스킵 스캔의 좋은 대상입니다. 그 이유는 다음에서 토토 사이트한 바와 같습니다.PostgreSQL : 문서 : 개발 : 11.3. 멀티 컬럼 젠 토토, 선행 열(the4열)에는 4개의 고유 값만 포함되어 있지만 두 번째/마지막 열(고유1열)에는 고유한 값이 많이 포함되어 있습니다.
또 다른 유형의 추가 정보는 필터 조건에 의해 제거된 행 수입니다:
토토 사이트 분석 선택 * FROM tenk1 WHERE ten < 7;
쿼리 계획
-------------------------------------------------------------------------------
tenk1의 Seq 스캔(비용=0.00..470.00 행=7000 너비=244)(실제 시간=0.030..1.995 행=7000.00 루프=1)
필터: (10 < 7)
필터에 의해 제거된 행: 3000
버퍼: 공유 히트=345
계획 시간: 0.102ms
실행 시간: 2.145ms
이러한 수는 조인 노드에 적용된 필터 조건에 특히 유용할 수 있습니다. 그만큼“행이 제거됨”라인은 하나 이상의 스캔된 행 또는 조인 노드의 경우 잠재적인 조인 쌍이 필터 조건에 의해 거부되는 경우에만 나타납니다.
필터 조건과 유사한 경우가 발생함“손실”색인 스캔. 예를 들어, 특정 점을 포함하는 다각형에 대한 다음 검색을 고려해보세요.
토토 사이트 분석 선택 * FROM 다각형_tbl WHERE f1 @ 다각형 '(0.5,2.0)';
쿼리 계획
----------------------------------------------------------------------------
Polygon_tbl의 시퀀스 스캔(비용=0.00..1.09행=1 너비=85)(실제 시간=0.023..0.023행=0.00 루프=1)
필터: (f1 @ '((0.5,2))'::폴리곤)
필터에 의해 제거된 행: 7
버퍼: 공유 적중=1
계획 시간: 0.039ms
실행 시간: 0.033ms
플래너는 이 샘플 테이블이 너무 작아서 인덱스 스캔을 수행할 수 없다고 생각합니다. 따라서 우리는 모든 행이 필터 조건에 의해 거부되는 일반 순차 스캔을 갖습니다. 그러나 인덱스 스캔을 강제로 사용하면 다음과 같은 결과가 나타납니다.
SET 활성화_seqscan TO 끄기;
토토 사이트 분석 선택 * FROM 폴리곤_tbl WHERE f1 @ 폴리곤 '(0.5,2.0)';
쿼리 계획
------------------------------------------------------------------------------------------------
Polygon_tbl에서 gpolygonind를 사용한 인덱스 스캔(비용=0.13..8.15행=1 너비=85)(실제 시간=0.074..0.074행=0.00 루프=1)
인덱스 조건: (f1 @ '((0.5,2))'::폴리곤)
인덱스 재검사로 제거된 행: 1
인덱스 검색: 1
버퍼: 공유 적중=1
계획 시간: 0.039ms
실행 시간: 0.098ms
여기서 우리는 인덱스가 하나의 후보 행을 반환한 것을 볼 수 있으며, 이는 인덱스 조건 재검사에 의해 거부되었습니다. 이는 GiST 인덱스가 다음과 같기 때문에 발생합니다.“손실”다각형 포함 테스트의 경우: 실제로 대상과 겹치는 다각형이 있는 행을 반환한 다음 해당 행에 대해 정확한 포함 테스트를 수행해야 합니다.
토토 사이트다음이 있습니다버퍼지정된 쿼리를 계획하고 실행하는 동안 수행되는 I/O 작업에 대한 추가 세부정보를 제공하는 옵션입니다. 표시된 버퍼 번호는 지정된 노드와 모든 하위 노드에 대해 적중, 읽기, 더티화 및 기록된 고유하지 않은 버퍼의 수를 표시합니다. 그만큼분석옵션은 암시적으로 다음을 활성화합니다.버퍼옵션. 이것이 바람직하지 않은 경우,버퍼명시적으로 비활성화될 수 있습니다:
토토 사이트(분석, 버퍼 끄기) SELECT * FROM tenk1 WHERE Unique1 < 100 AND Unique2 9000;
쿼리 계획
--------------------------------------------------------------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=25.07..60.11 행=10 너비=244)(실제 시간=0.105..0.114 행=10.00 루프=1)
조건을 다시 확인하세요: ((unique1 < 100) AND (unique2 9000))
힙 블록: 정확=10
- BitmapAnd(비용=25.07..25.07행=10 너비=0)(실제 시간=0.100..0.101행=0.00 루프=1)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)(실제 시간=0.027..0.027행=100.00 루프=1)
지수 조건: (고유1 < 100)
인덱스 검색: 1
- tenk1_unique2의 비트맵 인덱스 스캔(비용=0.00..19.78행=999너비=0)(실제 시간=0.070..0.070행=999.00루프=1)
인덱스 조건: (unique2 9000)
인덱스 검색: 1
계획 시간: 0.162ms
실행 시간: 0.143ms
이것을 명심하세요 왜냐하면분석 토토 사이트실제로 쿼리를 실행하면 쿼리에서 출력할 수 있는 결과가 무엇이든 인쇄를 위해 폐기되더라도 부작용은 평소와 같이 발생합니다.토토 사이트데이터. 테이블을 변경하지 않고 데이터 수정 쿼리를 분석하려면 나중에 명령을 롤백할 수 있습니다. 예를 들면 다음과 같습니다.
시작;
토토 사이트 분석 업데이트 tenk1 SET 100 = 100 + 1 여기서 고유 1 < 100;
쿼리 계획
----------------------------------------------------------------------------------------------------------------
tenk1 업데이트(비용=5.06..225.23행=0 너비=0)(실제 시간=1.634..1.635행=0.00 루프=1)
- tenk1의 비트맵 힙 스캔(비용=5.06..225.23행=100 너비=10)(실제 시간=0.065..0.141행=100.00 루프=1)
조건 재확인: (unique1 < 100)
힙 블록: 정확=90
버퍼: 공유 적중=4 읽기=2
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..5.04행=100 너비=0)(실제 시간=0.031..0.031행=100.00 루프=1)
지수 조건: (고유1 < 100)
인덱스 검색: 1
버퍼: 공유 읽기=2
계획 시간: 0.151ms
실행 시간: 1.856ms
롤백;
이 예에서 볼 수 있듯이 쿼리는 다음과 같습니다.삽입, 업데이트, 삭제또는병합명령을 사용하면 테이블 변경 사항을 적용하는 실제 작업은 최상위 수준 삽입, 업데이트, 삭제 또는 병합 계획 노드에서 수행됩니다. 이 노드 아래의 계획 노드는 이전 행을 찾거나 새 데이터를 계산하는 작업을 수행합니다. 위에서는 이미 본 것과 동일한 종류의 비트맵 테이블 스캔을 볼 수 있으며 해당 출력은 업데이트된 행을 저장하는 업데이트 노드에 공급됩니다. 데이터 수정 노드는 상당한 양의 실행 시간을 차지할 수 있지만(여기서는 가장 많은 시간을 소비함) 플래너는 현재 해당 작업을 토토 사이트하기 위해 비용 추정에 아무 것도 추가하지 않는다는 점에 주목할 가치가 있습니다. 올바른 쿼리 계획마다 수행해야 할 작업이 동일하므로 계획 결정에 영향을 미치지 않기 때문입니다.
언제업데이트, 삭제또는병합명령은 분할된 테이블이나 상속 계층에 영향을 미치며, 출력은 다음과 같습니다:
토토 사이트 업데이트 gtest_parent SET f1 = CURRENT_DATE WHERE f2 = 101;
쿼리 계획
---------------------------------------------------------------
gtest_parent 업데이트(비용=0.00..3.06행=0 너비=0)
gtest_child gtest_parent_1 업데이트
gtest_child2 gtest_parent_2 업데이트
gtest_child3 gtest_parent_3 업데이트
- 추가(비용=0.00..3.06행=3너비=14)
- gtest_child gtest_parent_1의 시퀀스 스캔(비용=0.00..1.01 행=1 너비=14)
필터: (f2 = 101)
- gtest_child2 gtest_parent_2의 시퀀스 스캔(비용=0.00..1.01 행=1 너비=14)
필터: (f2 = 101)
- gtest_child3 gtest_parent_3의 시퀀스 스캔(비용=0.00..1.01 행=1 너비=14)
필터: (f2 = 101)
이 예에서 업데이트 노드는 세 개의 하위 테이블을 고려해야 하지만 원래 언급된 파티션된 테이블은 고려하지 않습니다(데이터를 저장하지 않기 때문에). 따라서 테이블당 하나씩 세 개의 입력 검색 하위 계획이 있습니다. 명확성을 위해 업데이트 노드에는 업데이트될 특정 대상 테이블을 해당 하위 계획과 동일한 순서로 표시하도록 주석이 추가되었습니다.
그계획 시간표시자:분석 토토 사이트는 구문 분석된 쿼리에서 쿼리 계획을 생성하고 최적화하는 데 걸린 시간입니다. 구문 분석이나 재작성은 포함되지 않습니다.
그실행 시간표시자:분석 토토 사이트실행기 시작 및 종료 시간과 실행된 트리거를 실행하는 시간이 포함되지만 구문 분석, 재작성 또는 계획 시간은 포함되지 않습니다. 실행에 소요된 시간이전트리거가 있는 경우 관련 삽입, 업데이트 또는 삭제 노드의 시간에 포함됩니다. 하지만 실행에 소요된 시간이후트리거는 거기에서 계산되지 않습니다. 왜냐하면이후트리거는 전체 계획이 완료된 후 실행됩니다. 각 트리거에 소요된 총 시간(둘 중 하나)이전또는이후)도 별도로 표시됩니다. 지연된 제약 조건 트리거는 트랜잭션이 끝날 때까지 실행되지 않으므로 전혀 고려되지 않습니다.분석 토토 사이트.
최상위 노드에 표시된 시간에는 쿼리의 출력 데이터를 표시 가능한 형식으로 변환하거나 클라이언트에 보내는 데 필요한 시간이 포함되지 않습니다. 하는 동안분석 토토 사이트클라이언트에 데이터를 보내지 않습니다. 쿼리의 출력 데이터를 표시 가능한 형식으로 변환하고 이에 필요한 시간을 측정하도록 지시할 수 있습니다.직렬화옵션. 해당 시간은 별도로 표시되며, 전체 시간에도 포함됩니다.실행 시간.
실행 시간을 측정하는 두 가지 중요한 방법이 있습니다.분석 토토 사이트동일한 쿼리의 정상적인 실행에서 벗어날 수 있습니다. 첫째, 출력 행이 클라이언트에 전달되지 않으므로 네트워크 전송 비용이 포함되지 않습니다. I/O 변환 비용도 포함되지 않습니다.직렬화이 지정되었습니다. 둘째, 다음으로 추가된 측정 오버헤드입니다.분석 토토 사이트특히 속도가 느린 시스템에서는 중요할 수 있습니다.gettimeofday()운영 체제 호출. 다음을 사용할 수 있습니다.pg_test_timing시스템의 타이밍 오버헤드를 측정하는 도구입니다.
토토 사이트결과는 실제로 테스트하고 있는 상황과 크게 다른 상황으로 추정되어서는 안 됩니다. 예를 들어, 장난감 크기 테이블의 결과를 큰 테이블에 적용한다고 가정할 수 없습니다. 플래너의 비용 추정은 선형적이지 않으므로 더 크거나 작은 테이블에 대해 다른 계획을 선택할 수 있습니다. 극단적인 예는 하나의 디스크 페이지만 차지하는 테이블에서 인덱스 사용 가능 여부에 관계없이 거의 항상 순차 스캔 계획을 얻게 된다는 것입니다. 플래너는 어떤 경우든 테이블을 처리하기 위해 하나의 디스크 페이지 읽기가 필요하다는 것을 인식하므로 인덱스를 보기 위해 추가 페이지 읽기를 확장하는 것은 가치가 없습니다. (우리는 이런 일이 일어나는 것을 보았습니다.polygon_tbl위의 예.)
실제값과 추정값이 잘 일치하지 않는 경우가 있지만 실제로 잘못된 것은 아닙니다. 이러한 경우 중 하나는 계획 노드 실행이 a에 의해 중단될 때 발생합니다.제한또는 유사한 효과. 예를 들어,제한이전에 사용했던 쿼리
토토 사이트 분석 선택 * FROM tenk1 여기서 고유1 < 100 AND 고유2 9000 제한 2;
쿼리 계획
-----------------------------------------------------------------------------------------------------
제한(비용=0.29..14.33행=2너비=244)(실제 시간=0.051..0.071행=2.00루프=1)
버퍼: 공유 히트=16
- tenk1에서 tenk1_unique2를 사용한 인덱스 스캔(비용=0.29..70.50 행=10 너비=244) (실제 시간=0.051..0.070 행=2.00 루프=1)
인덱스 조건: (unique2 9000)
필터: (고유1 < 100)
필터에 의해 제거된 행: 287
인덱스 검색: 1
버퍼: 공유 히트=16
계획 시간: 0.077ms
실행 시간: 0.086ms
인덱스 스캔 노드의 예상 비용 및 행 수가 실행이 완료된 것처럼 표시됩니다. 그러나 실제로는 Limit 노드가 2개를 얻은 후 행 요청을 중단했으므로 실제 행 개수는 2개에 불과하고 실행 시간은 예상 비용보다 짧습니다. 이는 추정 오류가 아니며 추정값과 실제 값이 표시되는 방식의 불일치일 뿐입니다.
병합 조인에는 부주의한 사용자를 혼란스럽게 할 수 있는 측정 아티팩트도 있습니다. 병합 조인은 다른 입력이 소진되고 한 입력의 다음 키 값이 다른 입력의 마지막 키 값보다 큰 경우 하나의 입력 읽기를 중지합니다. 이 경우 더 이상 일치하는 항목이 없으므로 첫 번째 입력의 나머지 부분을 스캔할 필요가 없습니다. 이로 인해 한 명의 어린이를 모두 읽지 못하게 되며, 위에서 언급한 것과 같은 결과가 나타납니다.제한. 또한 외부(첫 번째) 하위 항목에 중복 키 값이 있는 행이 포함된 경우 내부(두 번째) 하위 항목이 백업되고 해당 키 값과 일치하는 행 부분을 다시 검색합니다.분석 토토 사이트동일한 내부 행의 반복 방출을 마치 실제 추가 행인 것처럼 계산합니다. 외부 중복이 많은 경우 내부 하위 계획 노드에 대해 보고된 실제 행 수는 실제로 내부 관계에 있는 행 수보다 훨씬 클 수 있습니다.
BitmapAnd 및 BitmapOr 노드는 구현 제한으로 인해 항상 실제 행 수를 0으로 보고합니다.
보통은,토토 사이트플래너가 생성한 모든 계획 노드를 표시합니다. 그러나 계획 시 사용할 수 없는 매개변수 값을 기반으로 특정 노드가 행을 생성할 수 없기 때문에 실행자가 특정 노드를 실행할 필요가 없다고 결정할 수 있는 경우가 있습니다. (현재 이는 분할된 테이블을 스캔하는 Append 또는 MergeAppend 노드의 하위 노드에서만 발생할 수 있습니다.) 이 경우 해당 계획 노드는 다음에서 생략됩니다.토토 사이트출력 및 a하위 계획이 제거됨:대신 주석이 나타납니다.N