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

13.1. 토토 사이트토토 사이트

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

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

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

토토 사이트 *에서 10에서 선택하십시오.

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

인용 한 숫자토토 사이트are :

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

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

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

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

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

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

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

예제로 돌아 가기 :

토토 사이트을 토토 사이트하십시오 * Tenk1에서;

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

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

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

당신은 그것을 알게 될 것입니다Tenk1358 개의 디스크 페이지와 10000 행이 있습니다. 따라서 비용은 추정됩니다 358 페이지 읽기, 비용SEQ_PAGE_COST모든 (기본적으로 1.0), + 10000 *CPU_TUPLE_COST기본적으로 0.01입니다.

이제 쿼리를 수정하여 A여기서조건 :

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

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

토토 사이트출력 쇼 그만큼여기서절로 적용되는 조항"필터"조건; 이것은 그것을 의미합니다 계획 노드는 스캔하는 각 행의 조건을 확인하고 조건을 전달하는 것만 출력합니다. 추정치 출력 행 때문에 때문에 출력 행이 줄었습니다.여기서절. 그러나 스캔은 여전히 ​​필요합니다 10000 줄을 모두 방문하여 비용이 줄어들지 않았습니다. 사실 확인하는 추가 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 단계 계획을 사용하기로 결정했습니다. 하단 계획 노드는 인덱스를 방문하여 행의 위치를 ​​찾습니다. 인덱스 조건과 일치 한 다음 상단 계획 노드 일치 실제로 테이블 자체에서 그 행을 가져옵니다. 가져 오기 별도의 행은 순차적으로 읽는 것보다 훨씬 비쌉니다 그들, 그러나 테이블의 모든 페이지가 방문한 것은 여전히 ​​순차적 스캔보다 저렴합니다. (그만큼 두 가지 수준의 계획을 사용하는 이유는 상단 계획 노드가 색인으로 식별 된 행 위치를 물리적으로 정렬합니다. 읽기 전에 주문하십시오. 별도의 페치. 그만큼"비트 맵"노드 이름에 언급 된 것은 다음을 수행하는 메커니즘입니다. 정렬.)

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

토토 사이트을 선택하십시오 * tenk1에서 ureight1 <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절로 적용 할 수 없습니다 인덱스 조건 (이 인덱스가에만 있으므로고유 한열). 대신 필터로 적용됩니다 인덱스에 의해 검색된 줄에. 따라서 비용은 실제로 있습니다 이 추가 점검을 반영하기 위해 조금 올라갔습니다.

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

10 <100 및 고유 2 9000에서 10에서 선택 *을 선택하십시오.

                                     쿼리 계획
-------------------------------------------------------------------------------------------------------------------------.
 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)
         색인 조건 : ( "외부".unique2 = t2.unique2)

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

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

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

set enable_nestloop = off;
토토 사이트 *에서 10, Tenk2 T2에서 선택하십시오.

                                        쿼리 계획
------------------------------------------------------------------------------------------------------------
 해시 조인 (비용 = 232.61..741.67 행 = 106 너비 = 488)
   해시 조건 : ( "외부".unique2 = "내부".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. 가입에 대한 총 시간 추정에는 무거운 요금도 포함됩니다. CPU 시간이 해시 표를 10000 회 조사하는 데. 메모, 그러나 우리는아님10000 회 충전 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)
         색인 조건 : ( "외부".unique2 = t2.unique2)
 총 런타임 : 14.452ms

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

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

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

주목할 가치가 있습니다토토 사이트결과는 하나는 실제로 테스트하고 있습니다. 예를 들어 장난감 크기의 결과 테이블은 큰 테이블에 적용한다고 가정 할 수 없습니다. 플래너의 비용 추정치는 선형이 아니므로 선택할 수 있습니다. 더 크거나 작은 테이블에 대한 다른 계획. 극단적 인 예 하나의 디스크 페이지 만 차지하는 테이블에서 인덱스가 있는지 여부에 관계없이 거의 항상 순차적 스캔 계획을 얻습니다. 사용 가능 여부. 플래너는 그것이 취할 것임을 알고 있습니다 어떤 경우에도 테이블을 처리하기 위해 하나의 디스크 페이지를 읽으므로 추가 페이지를 소비하는 데 가치가 없습니다. 색인.

노트

[1]

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