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

14.1. 토토설명

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

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

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

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

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

인용 한 숫자설명are (왼쪽에서 오른쪽) :

  • 추정 시작 토토 (출력 전 시간이 소비됩니다 스캔이 시작될 수 있습니다 (예 : 정렬 시간) 마디)

  • 추정 총 토토 (모든 행이 검색되는 경우 그들은 그렇지 않을 수도 있습니다. 예를 들어, aLimit조항은 지불이 부족합니다 총 토토Limit토토 노드 입력 노드)

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

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

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

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

the값은 약간 까다 롭습니다 이기 때문에not토토 노드에서 처리 또는 스캔 한 행 수. 그것은 일반적으로, 임의의 추정 선택성을 반영하는여기서-Clase 조건 노드에 적용됩니다. 이상적으로 최상위 행 추정치는 의지합니다 실제로 반환, 업데이트 된 행 수에 근사하십시오 쿼리로 삭제되었습니다.

예제로 돌아 가기 :

10에서 선택 *에서 선택 *;

                         쿼리 토토
---------------------------------------------------------------------------------
 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여기서조건 :

SELECT * SELECT *에서 TENK1 where 1 <7000;

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

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

이 쿼리가 선택한 실제 행 수는 7000이지만 그만큼추정치는 대략적인 것입니다. 이 실험을 복제하려고하면 아마도 약간 다른 추정치; 또한, 각 이후에 변경됩니다.분석통계이기 때문에 명령 제작분석에서 가져 왔습니다 테이블의 무작위 샘플.

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

10 <100에서 tenk1에서 선택 *을 선택하십시오.

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

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

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

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

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

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

다른 조건 추가여기서절 :

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

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

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

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

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.uique2절은 아직 관련이 없으므로 영향을 미치지 않습니다 외부 토토의 행 카운트. 내부 (하단) 토토의 경우고유 2현재 외부 토토의 값 인덱스를 생성하기 위해 행이 내부 색인 토토에 연결됩니다. 조건과 같은 조건t2.unique2 =상수. 그래서 우리는 똑같이 얻습니다 내부 스캔 계획과 우리가 얻는 토토, 예를 들어설명을 선택하십시오 * tenk2에서 where where 2 = 42. 루프 노드의 토토은 토토을 기준으로 설정됩니다. 외부 스캔의 및 각각에 대한 내부 스캔의 반복 OUTER ROW (106 * 3.01, 여기), 가입 할 CPU 시간이 약간 처리.

이 예에서 조인의 출력 행 카운트는 두 토토 행의 산물이지만, 그것은 모두 사실이 아닙니다. 가질 수 있기 때문에 사례여기서조항 두 테이블을 모두 언급하고 결합시에만 적용 할 수 있습니다. 입력 토토이 아닌 포인트. 예를 들어, 추가하면여기서 ... 그리고 t1.hundred < t2.hundred노드에 가입하지만 입력 토토을 변경하지 마십시오.

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

set enable_nestloop = off;
선택 * *
TENK1 T1, TENK2 T2로부터
여기서 t1.unique1 <100 및 t1.unique2 = t2.unique2;

                                        쿼리 토토
------------------------------------------------------------------------------------------------------------
 해시 조인 (토토 = 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.unique2각각Tenk2행. 읽는 토토Tenk1해시 테이블을 설정하는 것은 시작입니다 해시 조인 토토, 우리가 출력이 없기 때문에 읽기 시작Tenk2. 총계 가입에 대한 시간 추정에는 해시 표를 10000 회 조사하는 CPU 시간. 그러나 그 점에 유의하십시오 우리는not충전 10000 회 232.35; 해시 테이블 설정은 한 번만 수행됩니다 이 토토 유형.

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

분석 선택 *
TENK1 T1, 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총 런타임표시분석집행자 스타트 업 포함 파싱, 재 작성 또는 토토 시간은 종료 시간입니다. 을 위한삽입, 업데이트, 그리고삭제명령, 소비 된 시간 테이블 변경 사항 적용은 최상위 삽입으로 충전됩니다. 토토 노드를 업데이트하거나 삭제합니다. (이 노드 아래의 토토 노드 오래된 행을 찾거나/또는 컴퓨팅하는 작업을 나타냅니다. 새로운 것들.) 실행하는 데 소요되는 시간트리거 (있는 경우 트리거) 관련 삽입, 업데이트 또는 실행하는 데 소요되는 시간이지만 노드 삭제이후트리거는 아닙니다. 각각에 소요 된 시간 트리거 (하나또는이후)도 별도로 표시되며 포함됩니다 총 런타임. 그러나 지연된 제약 조건이 유발됩니다 거래 종료까지 실행되지 않으므로 표시분석 설명.

런타임이 측정 한 두 가지 중요한 방법은분석 설명정상에서 벗어날 수 있습니다 동일한 쿼리 실행. 첫째, 출력 행이 없기 때문에 클라이언트, 네트워크 전송 토토 및 I/O에게 제공됩니다 서식 토토이 포함되어 있지 않습니다. 둘째,에 의해 추가 된 오버 헤드분석중요 할 수 있습니다. 특히 느린 기계에서gettimeofday ()커널 호출.

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

노트

[1]

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