PostgreSQLa쿼리 토토 사이트각 쿼리마다 수신합니다. 쿼리 구조와 일치하는 올바른 토토 사이트을 선택하고 데이터의 속성은 상당히 중요합니다 성능, 따라서 시스템에는 복잡한플래너좋은 계획을 선택하려고합니다. 당신은 할 수 있습니다 토토 사이트배트맨 토토 : 문서 : 8.4 : 설명명령 플래너가 쿼리에 대해 어떤 쿼리 토토 사이트을 작성하는지 확인하십시오. 계획 읽기는 광범위한 튜토리얼이 필요한 예술입니다. 이것은 아닙니다. 그러나 여기에 몇 가지 기본 정보가 있습니다.
쿼리 토토 사이트의 구조는의 나무입니다.토토 사이트 노드. 트리의 하단 레벨에있는 노드 테이블 스캔 노드입니다. 테이블에서 원시 행을 반환합니다. 거기 다른 테이블 액세스를위한 다른 유형의 스캔 노드입니다. 방법 : 순차적 스캔, 인덱스 스캔 및 비트 맵 인덱스 스캔. 쿼리에 결합, 집계, 정렬 또는 기타가 필요한 경우 원시 행에서 작업하면 추가 노드가 있습니다. 스캔 노드 위에 이러한 작업을 수행합니다. 다시, 있습니다 일반적으로 이러한 작업을 수행 할 수있는 하나 이상의 가능한 방법은 다른 노드 유형도 여기에 나타날 수 있습니다. 의 출력설명각 노드마다 하나의 줄이 있습니다 기본 노드 유형과 비용을 보여주는 계획 트리 플래너가 해당 계획의 실행을 위해 만든 것으로 추정합니다. 마디. 첫 번째 줄 (최상위 노드)은 총계가 추정됩니다 계획의 실행 비용; 이 숫자는 플래너입니다 최소화하려고합니다.
출력이 어떻게 보이는지 보여주기 위해 사소한 예가 있습니다. 좋다:[1]
설명 *에서 10에서 선택하십시오. 쿼리 토토 사이트 --------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
인용 한 숫자설명are (왼쪽에서 오른쪽) :
추정 시작 비용 (출력 전 소비 시간 스캔이 시작될 수 있습니다 (예 : 정렬 시간) 마디)
추정 총 비용 (모든 행이 검색되는 경우 그들은 그렇지 않을 수도 있습니다. 예를 들어, aLimit조항은 지불이 부족합니다 총 비용Limit노드 토토 사이트 입력 노드)
이 토토 사이트 노드에 의해 추정 된 행 출력 수 (다시, 완료에 실행 된 경우에만)
이에 의해 출력의 추정 평균 너비 (바이트) 토토 사이트 노드
비용은 플래너의 비용 매개 변수 (참조섹션 18.6.2). 전통적인 관행은 비용을 측정하는 것입니다 디스크 페이지의 단위; 즉,seq_page_cost전통적으로 설정되었습니다1.0및 다른 비용 매개 변수는 그것에 대해 설정됩니다. (예제 이 섹션은 기본 비용 매개 변수로 실행됩니다.)
상위 수준 노드의 비용이 모든 어린이 노드의 비용이 포함되어 있습니다. 또한 중요합니다 비용은 플래너가 돌보는 것만 반영한다는 것을 깨달았습니다. 에 대한. 특히 비용은 소요 된 시간을 고려하지 않습니다. 결과 행을 클라이언트에 전송하면 실제 경과 시간의 중요한 요소; 그러나 플래너 계획을 변경하여 변경할 수 없기 때문에 무시합니다. (모든 정확한 계획은 동일한 행 세트를 출력합니다. 우리는 신뢰합니다.)
the행값은 약간 까다 롭습니다 이기 때문에아님토토 사이트 노드에서 처리 또는 스캔 한 행 수. 그것은 일반적으로, 임의의 추정 선택성을 반영하는여기서-Clase 조건 노드에 적용됩니다. 이상적으로 최상위 행 추정치는 의지합니다 실제로 반환, 업데이트 된 행 수에 근사하십시오 쿼리로 삭제되었습니다.
예제로 돌아 가기 :
10에서 선택 *에서 선택 *; 쿼리 토토 사이트 --------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
이것은 간단한 것만 큼 간단합니다. 그렇다면 :
relname = 'tenk1'; pg_class에서 reelpages, reltuples를 선택하십시오.
당신은 그것을 찾을 것입니다Tenk1
358 디스크 페이지 및 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 where 1 <7000; 쿼리 토토 사이트 ------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 7033 너비 = 244) 필터 : (고유 한 <7000)
설명출력 쇼 그만큼여기서조항이 A로 적용되고 있습니다"필터"조건; 이것은 그것을 의미합니다 토토 사이트 노드는 스캔하는 각 행의 조건을 확인하고 조건을 전달하는 것만 출력합니다. 추정치 출력 행은 때문에 감소했습니다.여기서절. 그러나 스캔은 여전히 필요합니다 10000 줄을 모두 방문하여 비용이 줄어들지 않았습니다. 사실 조금 올라갔습니다 (10000 *cpu_operator_cost, 정확하게) 추가 CPU 시간을 반영하려면여기서조건.
이 쿼리가 선택한 실제 행 수는 7000이지만 그만큼행추정치는 대략적인 것입니다. 이 실험을 복제하려고하면 아마도 약간 다른 추정치; 또한, 각 이후에 변경됩니다.분석통계이기 때문에 명령 제작분석a 테이블의 무작위 샘플.
이제 조건을보다 제한적으로 만들자 :
설명을 선택하십시오 * Tenk1에서 ureight1 <100; 쿼리 토토 사이트 ---------------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 2.37..232.35 행 = 106 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <100) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..2.37 행 = 106 너비 = 0) 색인 조건 : (고유 1 <100)
여기서 플래너는 2 단계 계획을 사용하기로 결정했습니다. 하단 토토 사이트 노드는 인덱스를 방문하여 행의 위치를 찾습니다. 인덱스 조건과 일치 한 다음 상단 토토 사이트 노드 일치 실제로 테이블 자체에서 그 행을 가져옵니다. 가져 오기 별도의 행은 순차적으로 읽는 것보다 훨씬 비쌉니다 그들, 그러나 테이블의 모든 페이지가 방문한 것은 여전히 순차적 스캔보다 저렴합니다. (그만큼 두 계획 수준을 사용하는 이유는 상단 토토 사이트 노드가 색인으로 식별 된 행 위치를 물리적으로 정렬합니다. 별도의 비용을 최소화하기 위해 읽기 전에 주문하십시오. 가져옵니다. 그만큼"비트 맵"노드 이름은 정렬을 수행하는 메커니즘입니다.)
여기서조건은 선택적입니다 충분히, 플래너는로 전환 할 수 있습니다."Simple"색인 스캔 토토 사이트 :
onecior1 <3에서 tenk1에서 선택 *을 선택하십시오. 쿼리 토토 사이트 ---------------------------------------------------------------------------------------------- Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..10.00 행 = 2 너비 = 244) 색인 조건 : (고유 1 <3)
이 경우 테이블 행은 인덱스 순서로 가져옵니다. 읽는 것이 더 비싸지 만 그 정도는 거의 없습니다. 행 위치를 분류하는 데 드는 추가 비용은 그만한 가치가 없습니다. 당신은 가장 자주이 토토 사이트 유형을 가져 오는 쿼리에 대한 것입니다. 단일 행, Queries주문 by인덱스와 일치하는 조건 주문하다.
다른 조건 추가여기서절 :
10 <3 및 stringu1 = 'xxx'에서 10에서 선택 *을 선택하십시오. 쿼리 토토 사이트 ---------------------------------------------------------------------------------------------- Tenk1에서 Tenk1_unique1을 사용한 인덱스 스캔 (비용 = 0.00..10.01 행 = 1 너비 = 244) 색인 조건 : (고유 1 <3) 필터 : (stringu1 = 'xxx':: name)
추가 조건Stri토토 사이트U1 = 'xxx'출력 행 추정치를 줄이지 만 비용은 아닙니다. 여전히 같은 행 세트를 방문해야합니다.Stri토토 사이트U1절로 적용 할 수 없습니다 인덱스 조건 (이 인덱스가에만 있으므로고유 한열). 대신 필터로 적용됩니다 인덱스에 의해 검색된 줄에. 따라서 비용은 실제로 있습니다 이 추가 점검을 반영하기 위해 약간 올라갔습니다.
참조 된 여러 열에 인덱스가있는 경우여기서, 플래너는 사용하도록 선택할 수 있습니다 인덱스의 및 또는 또는 조합 :
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 =Constant. 그래서 우리는 똑같이 얻습니다 내부 스캔 토토 사이트과 우리가 얻는 비용, 예를 들어select *에서 * tenk2에서 urection2 = 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총 런타임표시분석 설명집행자 스타트 업 포함 셧다운 시간과 결과 행을 처리하는 데 소요되는 시간. 구문 분석, 재 작성 또는 계획 시간은 포함되지 않습니다. Aselect쿼리, 총 런타임이됩니다 일반적으로보고 된 총 시간보다 조금 더 큽니다. 최상위 토토 사이트 노드. 을 위한삽입, 업데이트및삭제명령, 총 실행 시간이 될 수 있습니다 소비 된 시간이 포함되어 있기 때문에 상당히 큽니다 결과 행을 처리합니다. 이 명령의 경우, 시간 최고 토토 사이트 노드는 본질적으로 오래된 행을 찾는 데 소요되는 시간입니다. 및/또는 새로운 제품을 계산하지만 시간은 포함되지 않습니다. 변경 사항을 적용하는 데 소비되었습니다. 트리거를 발사하는 데 소요되는 시간은 또한 최고 토토 사이트 노드 외부에 있으며 별도로 표시됩니다. 각 방아쇠.
주목할 가치가 있습니다설명결과는 하나는 실제로 테스트하고 있습니다. 예를 들어 장난감 크기의 결과 테이블은 큰 테이블에 적용되는 것으로 가정 할 수 없습니다. 플래너의 비용 추정치는 선형이 아니므로 다른 것을 선택할 수 있습니다. 더 크거나 작은 테이블을 계획하십시오. 극단적 인 예는 그게 켜져 있습니다 하나의 디스크 페이지만을 차지하는 테이블은 거의 항상 인덱스 사용 가능 여부에 관계없이 순차적 인 스캔 계획을 세우십시오. 플래너는 하나의 디스크 페이지를 읽을 것임을 알고 있습니다. 어쨌든 테이블을 처리하려면 가치가 없습니다. 추가 페이지를 소비하여 인덱스를 보려고 읽습니다.
[1] |
이 섹션의 예는 회귀에서 가져옵니다 수행 후 데이터베이스 테스트진공 분석, 8.2 개발 소스 사용. 당신은해야합니다 예제를 직접 시도하면 비슷한 결과를 얻을 수 있습니다. 그러나 예상 비용과 행 계산은 약간 다를 수 있습니다. 왜냐하면분석의 통계는입니다 정확한 샘플이 아닌 임의의 샘플. |