이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 14.1. 설명 토토 사이트 순위버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

14.1. 토토 사이트설명

PostgreSQLa쿼리 계획각 쿼리마다 주어집니다. 쿼리 구조와 일치하는 올바른 계획을 선택하고 데이터의 속성은 상당히 중요합니다 성능, 따라서 시스템에는 복잡한플래너좋은 계획을 선택하려고합니다. 당신은 할 수 있습니다 토토 사이트PostgreSQL : 문서 : 8.3 : 스포츠 토토 결과명령 플래너가 쿼리에 대해 어떤 쿼리 계획을 작성하는지 확인하십시오. 계획 읽기는 광범위한 튜토리얼이 필요한 예술입니다. 이것은 아닙니다. 그러나 여기에 몇 가지 기본 정보가 있습니다.

쿼리 계획의 구조는의 나무입니다.계획 노드. 하단 레벨의 노드는 테이블입니다 스캔 노드 : 테이블에서 원시 행을 반환합니다. 거기 있습니다 다른 테이블 액세스 방법에 대한 다른 유형의 스캔 노드 : 순차적 스캔, 인덱스 스캔 및 비트 맵 인덱스 스캔. 만약 쿼리에는 결합, 집계, 정렬 또는 기타 작업이 필요합니다 원시 행에는 추가 노드가 있습니다"위"스캔 노드는 이러한 작업을 수행합니다. 다시 말하지만, 일반적으로이를 수행 할 수있는 가능한 방법이 있습니다. 작업이 있으므로 다른 노드 유형도 여기에 나타날 수 있습니다. 그만큼 출력설명각각에 대해 하나의 줄이 있습니다 기본 노드 유형과 비용을 보여주는 플랜 트리의 노드 플래너가 해당 계획의 실행을 위해 만든 것으로 추정합니다. 마디. 첫 번째 줄 (최상위 노드)은 총계가 추정됩니다 계획의 실행 비용; 이 숫자는 플래너입니다 최소화하려고합니다.

여기에 사소한 예가 있습니다. 출력이 어떻게 보이는지 보여주기 위해 좋다.[1]

설명 *에서 10에서 선택하십시오.

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

인용 한 숫자설명are :

  • 추정 시작 토토 사이트 (출력 스캔 전 소비 시간 예를 들어 정렬 노드에서 정렬을 수행 할 시간을 시작할 수 있습니다.)

  • 추정 총 토토 사이트 (모든 행을 검색 해야하는 경우, 예를 들어, A가있는 쿼리와 같은 것은 아닙니다.Limit절은 부족합니다 총 토토 사이트 지불Limit계획 노드 입력 노드 계획)

  • 이 계획 노드에 의한 추정 행 출력 수 (다시, 완료에 실행 된 경우에만.)

  • 이에 의해 출력의 추정 평균 너비 (바이트) 계획 노드

비용은 플래너의 비용 매개 변수 (참조섹션 18.6.2). 전통적인 관행은 토토 사이트을 측정하는 것입니다 디스크 페이지의 단위; 즉,SEQ_PAGE_COST전통적으로1.0및 다른 토토 사이트 매개 변수는 그것에 대해 설정됩니다. 예제 이 섹션은 기본 토토 사이트 매개 변수로 실행됩니다.

상위 수준 노드의 비용이 모든 어린이 노드의 비용이 포함되어 있습니다. 또한 중요합니다 비용은 플래너가 돌보는 것만 반영한다는 것을 깨달았습니다. 에 대한. 특히 비용은 소요 된 시간을 고려하지 않습니다. 결과 행을 클라이언트에 전송하면 진정한 경과 시간의 중요한 요소; 그러나 플래너 계획을 변경하여 변경할 수 없기 때문에 무시합니다. (모든 정확한 계획은 동일한 행 세트를 출력합니다. 우리는 신뢰합니다.)

행 출력은 약간 까다 롭기 때문에not처리 된 행 수 또는 계획 노드에 의해 스캔됩니다. 일반적으로 반영합니다 임의의 예상 선택성여기서-적용되는 클레스트 조건 노드. 이상적으로 최상위 행 추정치는 대략적으로 나타납니다 실제로 반환, 업데이트 또는 삭제 된 행의 수는 질문.

예를 들어 반환 :

설명 *에서 * Tenk1에서;

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

이것은 얻는 것만 큼 간단합니다. 그렇다면 :

relname = 'tenk1'; pg_class에서 reelpages, reltuples를 선택하십시오.

당신은 그것을 알게 될 것입니다Tenk1358 개의 디스크 페이지와 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여기서조건 :

Tenk1에서 선택 *을 설명하십시오.

                         쿼리 계획
-------------------------------------------------------------------
 Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 7033 너비 = 244)
   필터 : (고유 한 <7000)

설명출력 쇼 그만큼여기서절로 적용되는 조항"필터"조건; 이것은 그것을 의미합니다 계획 노드는 스캔하는 각 행의 조건을 확인하고 조건을 전달하는 것만 출력합니다. 추정치 출력 행 때문에 때문에 출력 행이 줄었습니다.여기서절. 그러나 스캔은 여전히 ​​필요합니다 10000 줄을 모두 방문하여 토토 사이트이 줄어들지 않았습니다. 사실 조금 올라갔습니다 (10000 *cpu_operator_cost, 정확하게) 추가 CPU 시간을 반영하려면여기서조건.

이 쿼리가 선택한 실제 행 수는 7000이지만 행 추정치는 대략적입니다. 복제하려고한다면 이 실험은 아마도 약간 다를 것입니다 추정; 또한, 각 이후에 변경됩니다.분석통계가 생성 되었기 때문에 명령 에 의해분석는 무작위로 가져옵니다 테이블의 샘플.

이제 조건을보다 제한적으로 만들자 :

설명을 선택하십시오 * Tenk1에서 where ightor1 <100;

                                  쿼리 계획
----------------------------------------------------------------------------------------------
 Tenk1의 비트 맵 힙 스캔 (비용 = 2.37..232.35 행 = 106 너비 = 244)
   COND를 다시 확인하십시오 : (고유 1 <100)
   - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..2.37 행 = 106 너비 = 0)
         색인 조건 : (고유 1 <100)

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

여기서조건은 선택적입니다 충분히, 플래너는로 전환 할 수 있습니다."Simple"색인 스캔 계획 :

설명 * 10 <3 <3;

                                  쿼리 계획
----------------------------------------------------------------------------------------------
 Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..10.00 행 = 2 너비 = 244)
   색인 조건 : (고유 1 <3)

이 경우 테이블 행은 색인 순서로 가져옵니다. 읽는 것이 더 비싸지 만 그 정도는 거의 없습니다. 행 위치를 분류하는 데 드는 추가 토토 사이트은 그만한 가치가 없습니다. 당신은 가장 자주이 계획 유형을 가져 오는 쿼리에 대한 것입니다. 단일 행, 요청을 요청하는 쿼리의 경우주문 by인덱스와 일치하는 조건 주문하다.

다른 조건 추가여기서절 :

tenk1에서 *를 선택하십시오.

                                  쿼리 계획
----------------------------------------------------------------------------------------------
 Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..10.01 행 = 1 너비 = 244)
   색인 조건 : (고유 1 <3)
   필터 : (stringu1 = 'xxx':: name)

추가 조건Stri토토 사이트U1 = 'xxx'출력 행 추정치를 줄이지 만 토토 사이트은 아닙니다. 여전히 같은 행 세트를 방문해야합니다.Stri토토 사이트U1절로 적용 할 수 없습니다 인덱스 조건 (이 인덱스가에만 있으므로고유 1열). 대신 필터로 적용됩니다 인덱스에 의해 검색된 줄에. 따라서 토토 사이트은 실제로 있습니다 이 추가 점검을 반영하기 위해 조금 올라갔습니다.

토토 사이트 된 여러 열에 인덱스가있는 경우여기서, 플래너는 AN 및 OR을 사용하도록 선택할 수 있습니다 또는 인덱스의 조합 :

Tenk1에서 선택 *을 선택하십시오.

                                     쿼리 계획
-------------------------------------------------------------------------------------------------------------------------.
 Tenk1의 비트 맵 힙 스캔 (비용 = 11.27..49.11 행 = 11 너비 = 244)
   COND를 다시 확인하십시오 : ((고유 1 <100) 및 (고유 2 9000))
   - bitmapand (비용 = 11.27..11.27 행 = 11 너비 = 0)
         - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..2.37 행 = 106 너비 = 0)
               색인 조건 : (고유 1 <100)
         - tenk1_unique2의 비트 맵 인덱스 스캔 (비용 = 0.00..8.65 행 = 1042 너비 = 0)
               색인 조건 : (고유 2 9000)

그러나 두 인덱스를 모두 방문해야하므로 그렇지 않습니다 단 하나의 색인을 사용하고 치료하는 것과 비교하여 반드시 승리 필터로서 다른 조건. 당신이 관련된 범위를 변화시키는 경우 그에 따라 계획이 바뀌는 것을 볼 수 있습니다.

우리가 있었던 열을 토토 사이트하여 두 개의 테이블을 결합 해 보겠습니다. 토론 :

설명 *에서 * Tenk1 T1, Tenk2 T2에서 t1.unique1 <100 및 t1.unique2 = t2.unique2;

                                      쿼리 계획
-----------------------------------------------------------------------------------------------------
 중첩 루프 (비용 = 2.37..553.11 행 = 106 너비 = 488)
   - tenk1 t1의 비트 맵 힙 스캔 (비용 = 2.37..232.35 행 = 106 너비 = 244)
         COND를 다시 확인하십시오 : (고유 1 <100)
         - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..2.37 행 = 106 너비 = 0)
               색인 조건 : (고유 1 <100)
   - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.00..3.01 행 = 1 너비 = 244)
         색인 조건 : (T2.Unique2 = T1.unique2)

이 중첩 루프 조인에서 외부 스캔은 동일한 비트 맵입니다. 우리가 이전에 본 인덱스 스캔이므로 비용과 행 계수는 우리가 적용하고 있기 때문에여기서고유 한 <100해당 노드에서. 그만큼t1.unique2 = t2.unique2절은입니다 아직 관련이 없으므로 외부의 행 수에 영향을 미치지 않습니다. 주사. 내부 스캔의 경우고유 2현재 외부 스캔 행의 값은 내부에 연결됩니다. 와 같은 색인 조건을 생성하기위한 색인 스캔t2.unique2 =Constant. 그래서 우리는 똑같이 얻습니다 내부 스캔 계획과 우리가 얻는 토토 사이트, 예를 들어설명을 선택하십시오 * tenk2에서 where where 2 = 42. 루프 노드의 토토 사이트은 토토 사이트을 기준으로 설정됩니다. 외부 스캔의 및 각각에 대한 내부 스캔의 반복 OUTER ROW (106 * 3.01, 여기), 가입 할 CPU 시간이 약간 처리.

이 예에서 조인의 출력 행 카운트는 두 스캔 행의 산물이지만, 그것은 사실이 아닙니다. 일반적으로 일반적으로 가질 수 있기 때문에여기서두 테이블을 언급하는 클로스 입력 스캔이 아닌 결합 지점에서만 적용됩니다. 을 위한 예를 들어, 추가하면어디서 ... 그리고 T1. Hundred <t2.hundred, 출력 행 카운트가 줄어 듭니다 결합 노드이지만 입력 스캔도 변경하지 않습니다.

변형 계획을 보는 한 가지 방법은 플래너에게 승자라고 생각한 전략을 무시하고 에 설명 된 플래그 활성화/비활성화섹션 18.6.1. (이것은 조잡한 도구이지만 유용합니다. 참조섹션 14.3.)

set enable_nestloop = off;
설명 *에서 10, Tenk2 T2에서 선택하십시오.

                                        쿼리 계획
------------------------------------------------------------------------------------------------------------
 해시 조인 (비용 = 232.61..741.67 행 = 106 너비 = 488)
   해시 조건 : (T2.Unique2 = t1.unique2)
   - TENK2 T2의 SEQ 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
   - 해시 (비용 = 232.35..232.35 행 = 106 너비 = 244)
         - tenk1 t1의 비트 맵 힙 스캔 (비용 = 2.37..232.35 행 = 106 너비 = 244)
               COND를 다시 확인하십시오 : (고유 1 <100)
               - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..2.37 행 = 106 너비 = 0)
                     색인 조건 : (고유 1 <100)

이 계획은 100 개의 흥미로운 행을 추출 할 것을 제안합니다.Tenk1동일한 오래된 색인 사용 스캔하고 메모리 해시 테이블에 보관 한 다음 순차적 스캔Tenk2, 프로빙 가능한 일치에 대한 해시 테이블에t1.unique2 = t2.unique224491_24502Tenk2행. 읽는 토토 사이트Tenk1해시 테이블을 설정하는 것은 전적으로입니다 해시 조인의 시작 토토 사이트, 우리는 줄을 얻지 못하므로 우리가 읽기 시작할 때까지Tenk2. 가입에 대한 총 시간 추정에는 무거운 요금도 포함됩니다. CPU 시간이 해시 표를 10000 회 조사하는 데. 메모, 그러나 우리는not10000 회 충전 232.35; 해시 테이블 설정은이 계획 유형에서 한 번만 수행됩니다.

플래너의 정확도를 확인할 수 있습니다. 사용하여 예상 비용설명 분석. 이 명령은 실제로 쿼리를 실행 한 다음 실행합니다 각 계획 노드 내에 누적 된 실제 실행 시간을 표시합니다. 평범한 것과 동일한 추정 비용과 함께설명쇼. 예를 들어, 우리는 결과를 얻을 수 있습니다 이와 같이:

설명을 설명하십시오 * 선택 * 10, Tenk2 T2에서 t1.unique1 <100 및 t1.unique2 = t2.unique2;

                                                            쿼리 계획
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 중첩 루프 (비용 = 2.37..553.11 행 = 106 너비 = 488) (실제 시간 = 1.392..12.700 행 = 100 루프 = 1)
   - tenk1 t1의 비트 맵 힙 스캔 (비용 = 2.37..232.35 행 = 106 너비 = 244) (실제 시간 = 0.878..2.367 행 = 100 루프 = 1)
         COND를 다시 확인하십시오 : (고유 1 <100)
         - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..2.37 행 = 106 너비 = 0) (실제 시간 = 0.546..0.546 행 = 100 루프 = 1)
               색인 조건 : (고유 1 <100)
   - tenk2 t2에서 tenk2_unique2를 사용한 색인 스캔 (비용 = 0.00..3.01 행 = 1 너비 = 244) (실제 시간 = 0.067..0.078 행 = 1 루프 = 100)
         색인 조건 : (T2.Unique2 = T1.unique2)
 총 런타임 : 14.452ms

"실제 시간"값 실시간 밀리 초, 반면"토토 사이트"추정치는 임의 단위로 표현됩니다. 그래서 그들은 일치하지 않을 것입니다. 주의를 기울여야 할 것 실제 시간과 예상 토토 사이트의 비율이 일관된.

일부 쿼리 계획에서는 하위 플랜 노드가 가능합니다. 두 번 이상 실행되었습니다. 예를 들어, 내부 색인 스캔은 다음과 같습니다 위의 중첩 루프 계획에서 외부 행당 한 번 실행됩니다. ~ 안에 그러한 경우,"루프"값 보고서 노드의 총 실행 수와 실제 시간 표시된 행 값은 실행 중 평균입니다. 이것은 끝났습니다 토토 사이트이 추정되는 방식과 숫자를 비교할 수 있습니다. 표시됩니다. 곱하기"루프"실제로 노드에서 소비 된 총 시간을 얻는 값.

the총 런타임분석executor 스타트 업 포함 및 셧다운 시간과 결과 행을 처리하는 데 소요되는 시간. 구문 분석, 재 작성 또는 계획 시간은 포함되지 않습니다. Aselect쿼리, 총 런타임이됩니다 일반적으로보고 된 총 시간보다 조금 더 큽니다. 최상위 계획 노드. 을 위한삽입, 업데이트삭제명령, 총 실행 시간이 될 수 있습니다 소비 된 시간이 포함되어 있기 때문에 상당히 큽니다 결과 행을 처리합니다. 이 명령에서 최상위 계획 노드는 본질적으로 새로운 계산에 소요되는 시간입니다. 행 및/또는 오래된 것들을 찾는 줄이지만 변경 사항을 적용하는 데 소요되는 시간. 트리거를 발사하는 데 소요되는 시간 어느 누구도 최상위 계획 노드 외부에 있으며 별도로 표시됩니다. 각 방아쇠에 대해.

주목할 가치가 있습니다설명결과는 하나는 실제로 테스트하고 있습니다. 예를 들어 장난감 크기의 결과 테이블은 큰 테이블에 적용되는 것으로 가정 할 수 없습니다. 플래너의 비용 추정치는 선형이 아니므로 다른 것을 선택할 수 있습니다. 더 크거나 작은 테이블을 계획하십시오. 극단적 인 예는 그게 켜져 있습니다 하나의 디스크 페이지만을 차지하는 테이블은 거의 항상 인덱스 사용 가능 여부에 관계없이 순차적 인 스캔 계획을 세우십시오. 플래너는 하나의 디스크 페이지를 읽을 것임을 알고 있습니다. 어쨌든 테이블을 처리하려면 가치가 없습니다. 추가 페이지를 소비하여 인덱스를 보려고 읽습니다.

노트

[1]

이 섹션의 예는 회귀에서 가져옵니다 수행 후 데이터베이스 테스트진공 분석, 8.2 개발 소스 사용. 당신은해야합니다 예제를 직접 시도하면 비슷한 결과를 얻을 수 있습니다. 그러나 귀하의 예상 비용과 행 계산은 아마도 다를 것입니다. 약간 약간분석's 통계는 정확하지 않고 임의의 샘플입니다.