쿼리 토토 꽁 머니은 여러 가지 요인에 의해 영향을 받을 수 있습니다. 일부 이것들은 사용자가 조작할 수 있지만 다른 것들은 시스템의 기본 설계의 기본입니다. 이 장 이해와 조정에 대한 몇 가지 힌트를 제공합니다.포스트그레토토 꽁 머니.
저자:Tom Lane이 작성, 다음 날짜의 이메일에서 작성: 2000-03-27.
포스트그레스고안쿼리 계획각 쿼리에 대해 제공됩니다. 쿼리 구조와 쿼리 구조에 맞는 올바른 계획 선택 데이터의 속성은 좋은 결과를 위해 절대적으로 중요합니다. 토토 꽁 머니. 다음을 사용할 수 있습니다.설명시스템이 어떤 쿼리 계획을 생성하는지 확인하는 명령 쿼리. 불행하게도 계획 읽기는 가치 있는 예술이다. 튜토리얼을 작성했는데 시간이 없었습니다. 여기 몇 가지가 있습니다 빠르고 더러운 설명.
현재 EXPLAIN에 의해 인용된 숫자는 다음과 같습니다:
예상 시작 토토 꽁 머니(출력까지 소요되는 시간) 스캔이 시작될 수 있습니다(예: SORT에서 정렬을 수행할 시간). 노드).
예상 총 비용(모든 튜플이 검색된 경우, 그렇지 않을 수도 있습니다 --- LIMIT가 포함된 쿼리는 다음 값에 도달하지 못할 것입니다. 예를 들어 총 비용을 지불합니다.
이 계획 노드에 의해 출력된 예상 행 수 (다시 말하지만, LIMIT에 관계없이).
다음에 의해 출력된 행의 예상 평균 너비(바이트) 이 계획 노드.
비용은 디스크 페이지 가져오기 단위로 측정됩니다. (CPU 노력 추정치는 다음을 사용하여 디스크 페이지 단위로 변환됩니다. 상당히 임의적인 퍼지 요인. 실험해보고 싶다면 이러한 요소는 런타임 구성 목록을 참조하세요. 의 매개변수관리자 안내.)
상위 노드의 비용은 모든 하위 노드의 비용이 포함됩니다. 그것은 또한 중요하다 비용은 단지 그 비용이 반영하는 것만을 반영한다는 것을 깨닫는 것입니다. 플래너/옵티마이저가 관심을 갖고 있습니다. 특히 비용이 들지 않는다. 결과 튜플을 프론트엔드 --- 이는 게임 내에서 매우 지배적인 요소가 될 수 있습니다. 실제 경과 시간이지만 플래너는 이를 무시합니다. 계획을 변경하여 변경하세요. (모든 올바른 계획이 출력됩니다. 동일한 튜플 세트라고 믿습니다.)
행 출력은 약간 까다롭습니다.아님다음에 의해 처리/스캔된 행 수 쿼리 --- 일반적으로 예상 금액을 반영하면 더 적습니다. 사용 중인 WHERE 절 제약 조건의 선택성 이 노드에 적용됩니다. 이상적으로 최상위 행 추정치는 실제로 반환, 업데이트 또는 행 수를 대략적으로 계산합니다. 쿼리에 의해 삭제됨(다시 말하지만, 제한).
평균 너비는 꽤 가짜입니다. 가변 길이의 평균 길이에 대해 전혀 모릅니다. 열. 앞으로는 개선할 생각이지만 너비가 사용되지 않기 때문에 문제를 일으킬 가치가 없을 수도 있습니다. 아주 많이.
다음은 몇 가지 예입니다(회귀 테스트 데이터베이스 사용). 진공 분석 후 거의 7.0 소스):
regression=# 설명 select * from tenk1; 공지: 쿼리 계획: tenk1의 시퀀스 스캔(비용=0.00..333.00행=10000너비=148)
이것은 매우 간단합니다. 그렇게 한다면
relname = 'tenk1'인 pg_class에서 * 선택;tenk1에 233개의 디스크 페이지와 10000개의 디스크 페이지가 있다는 것을 알게 될 것입니다. 튜플. 따라서 비용은 1.0으로 정의된 233개의 블록 읽기로 추정됩니다. 각각에 10000 * 현재 0.01인 cpu_tuple_cost를 더합니다(시도)cpu_tuple_cost 표시).
이제 제한을 추가하기 위해 쿼리를 수정합시다 절:
regression=# 설명 select * from tenk1 where Unique1 < 1000; 공지: 쿼리 계획: tenk1의 시퀀스 스캔(비용=0.00..358.00행=1000 너비=148)출력 행의 추정치가 다음으로 인해 감소했습니다. WHERE 절. (tenk1이 특히 간단한 경우 --- Unique1 열에는 10000이 있습니다. 0에서 9999까지의 고유한 값이 있으므로 추정자의 선형 최소 열 값과 최대 열 값 사이의 보간이 중단되었습니다.) 그러나 스캔은 여전히 10000개의 행을 모두 방문해야 하므로 비용은 감소하지 않았습니다. 실제로는 이를 반영하기 위해 약간 상승했습니다. WHERE 조건을 확인하는 데 추가 CPU 시간이 소요됩니다.
쿼리를 수정하여 자격을 다음과 같이 제한하십시오. 더:
regression=# 설명 select * from tenk1 where Unique1 < 100; 공지: 쿼리 계획: tenk1에서 tenk1_unique1을 사용하는 인덱스 스캔(비용=0.00..89.35행=100너비=148)WHERE 조건을 만들면 이를 알 수 있습니다 충분히 선택적이라면 기획자는 결국 다음과 같은 결정을 내릴 것입니다. indexscan은 순차 스캔보다 저렴합니다. 이 계획은 오직 인덱스 때문에 100개의 튜플을 방문해야 하므로 그럼에도 불구하고 승리합니다. 각 개별 가져오기에는 비용이 많이 든다는 사실입니다.
자격에 다른 조건을 추가하십시오:
regression=# 설명 select * from tenk1 여기서 고유1 < 100 및 회귀-# stringu1 = 'xxx'; 공지: 쿼리 계획: tenk1에서 tenk1_unique1을 사용하는 인덱스 스캔(비용=0.00..89.60행=1너비=148)추가된 절 "stringu1 = 'xxx'"는 출력 행을 줄입니다 추정하지만 토토 꽁 머니은 아닙니다. 여전히 같은 곳을 방문해야 하기 때문입니다. 튜플 세트.
우리가 설정한 필드를 사용하여 두 테이블을 결합해 보겠습니다. 논의 중:
regression=# 설명 select * from tenk1 t1, tenk2 t2 여기서 t1.unique1 < 100
회귀-# 및 t1.unique2 = t2.unique2;
공지: 쿼리 계획:
중첩 루프(비용=0.00..144.07행=100 너비=296)
- tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔
(비용=0.00..89.35행=100너비=148)
- tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔
(비용=0.00..0.53행=1너비=148)
이 중첩 루프 조인에서 외부 스캔은 동일합니다 지난번 예에서 사용한 indexscan과 그에 따른 비용 "unique1"을 적용하기 때문에 행 개수는 동일합니다. 해당 노드에 < 100" WHERE 절이 있습니다. "t1.unique2 = t2.unique2" 절은 아직 관련이 없으므로 영향을 미치지 않습니다. 외부 스캔의 행 수. 내부 스캔의 경우 현재 외부 스캔 튜플의 고유2 값은 내부에 연결됩니다. indexscan은 "t2.unique2 =와 같은 indexqual을 생성합니다.상수". 그래서 우리는 동일한 내부 스캔을 얻습니다. 예를 들어, "설명에서 *를 선택하세요."라고 말하면서 계획과 비용을 알아보세요. 고유2 = 42"인 tenk2. 그런 다음 루프 노드의 비용이 설정됩니다. 외부 스캔 비용에 1회 반복을 더한 금액을 기준으로 합니다. 각 외부 튜플(여기서는 100 * 0.53)에 대한 내부 스캔과 조인 처리를 위한 CPU 시간이 거의 없습니다.
이 예에서 루프의 출력 행 개수는 다음과 같습니다. 두 스캔의 행 개수를 곱한 값이지만 이는 사실이 아닙니다. 일반적으로 다음과 같은 WHERE 절을 가질 수 있기 때문입니다. 두 관계를 모두 언급하므로 조인 시에만 적용할 수 있습니다. 입력 스캔이 아닌 지점입니다. 예를 들어 추가하면 "WHERE ... AND t1.hundred < t2.hundred", 그러면 조인 노드의 행 수를 출력하지만 입력은 변경하지 않습니다. 스캔하다.
변형 계획을 보는 한 가지 방법은 계획자가 다음을 수행하도록 강제하는 것입니다. 승자라고 생각되는 전략은 무엇이든 무시하고 다음을 사용합니다. 각 계획 유형에 대한 활성화/비활성화 플래그. (이것은 조잡한 것입니다. 도구이지만 유용합니다. 또한 참조하세요섹션 11.2.)
regression=# set 활성화_nestloop = 꺼짐;
변수 설정
회귀=# 설명 select * from tenk1 t1, tenk2 t2 여기서 t1.unique1 < 100
회귀-# 및 t1.unique2 = t2.unique2;
공지: 쿼리 계획:
해시 조인(비용=89.60..574.10행=100너비=296)
- tenk2 t2의 시퀀스 스캔
(비용=0.00..333.00행=10000너비=148)
- 해시(비용=89.35..89.35행=100너비=148)
- tenk1 t1에서 tenk1_unique1을 사용한 인덱스 스캔
(비용=0.00..89.35행=100너비=148)이 계획은 100개의 흥미로운 행을 추출할 것을 제안합니다.
tenk1은 이전과 동일한 인덱스 스캔을 사용하고 이를 메모리 내 저장합니다.
해시 테이블을 검색한 다음 tenk2를 순차적으로 스캔하여 다음을 조사합니다.
"t1.unique2 = t2.unique2"와 일치할 수 있는 해시 테이블
각 tenk2 튜플. tenk1을 읽고 해시 테이블을 설정하는 데 드는 비용
우리는 아무 것도 얻지 못하므로 해시 조인을 위한 전적으로 시작 비용입니다.
tenk2를 읽을 수 있을 때까지 튜플을 꺼냅니다. 총 시간
조인 추정치에는 상당히 높은 CPU 요금도 포함되어 있습니다.
해시 테이블을 10000번 조사하는 데 걸리는 시간입니다. 그러나 우리는
89.35의 10000배를 충전하지 않습니다. 해시 테이블 설정은
이 계획 유형에서는 한 번 완료되었습니다.