쿼리 성능은 여러 가지 요인에 의해 영향을 받을 수 있습니다. 일부 이것들은 사용자가 조작할 수 있지만 다른 것들은 시스템의 기본 설계의 기본입니다. 이 장 이해와 조정에 대한 몇 가지 힌트를 제공합니다.포스트그레SQL토토 사이트.
PostgreSQL고안쿼리 계획각 쿼리에 대해 제공됩니다. 쿼리 구조와 쿼리 구조에 맞는 올바른 계획 선택 데이터의 속성은 좋은 결과를 위해 절대적으로 중요합니다. 토토 사이트이 있으므로 시스템에는 복잡한 내용이 포함되어 있습니다.플래너좋은 계획을 선택하려고 노력합니다. 당신 사용할 수 있습니다.스포츠 토토 : 문서 : 8.1 : 설명플래너가 어떤 쿼리 계획을 생성하는지 확인하는 명령 쿼리. 계획 읽기는 광범위한 연구를 할 가치가 있는 예술입니다. 이것은 튜토리얼이 아닙니다. 하지만 여기에는 몇 가지 기본 사항이 있습니다. 정보.
쿼리 계획의 구조는 트리입니다.계획 노드. 맨 아래 수준의 노드는 테이블입니다. 스캔 노드: 테이블에서 원시 행을 반환합니다. 있다 다양한 테이블 액세스를 위한 다양한 유형의 스캔 노드 방법: 순차 스캔, 인덱스 스캔, 비트맵 인덱스 스캔. 쿼리에 조인, 집계, 정렬 또는 기타 작업이 필요한 경우 원시 행에 대한 작업을 수행하면 추가 노드가 있게 됩니다."꼭대기"수행할 스캔 노드 이러한 작업. 다시 말하지만, 일반적으로 둘 이상이 있습니다. 이러한 작업을 수행하는 가능한 방법이므로 다양한 노드 유형 여기에도 나타날 수 있습니다. 의 출력토토 사이트계획의 각 노드에 대해 한 줄이 있습니다. 기본 노드 유형과 예상 비용을 보여주는 트리 해당 계획 노드의 실행을 위해 만들어진 플래너입니다. 첫 번째 라인(최상위 노드)에는 다음에 대한 예상 총 실행 비용이 있습니다. 계획; 기획자가 원하는 것은 바로 이 숫자입니다. 최소화합니다.
다음은 출력이 무엇인지 보여주기 위한 간단한 예입니다. 것 같군요.[1]
토토 사이트 선택 * FROM tenk1;
쿼리 계획
------------------------------------------------
tenk1의 시퀀스 스캔(비용=0.00..458.00행=10000너비=244)
인용된 숫자토토 사이트다음은:
예상 시작 비용(출력까지 소요되는 시간) 스캔이 시작될 수 있습니다(예: 정렬을 수행할 시간). 노드.)
예상 총 비용(모든 행을 검색하려는 경우, 그렇지 않을 수도 있습니다. 예를 들어, a제한절이 부족하면 중지됩니다. 총 비용을 지불합니다.한도계획 노드의 입력 노드.)
이 계획 노드에 의해 출력된 예상 행 수 (다시 말하지만, 실행이 완료되는 경우에만 해당됩니다.)
다음에 의해 출력된 행의 예상 평균 너비(바이트) 이 계획 노드
비용은 디스크 페이지 가져오기 단위로 측정됩니다. 그 즉, 1.0은 정의에 따라 하나의 순차적 디스크 페이지 읽기와 같습니다. (CPU 노력 추정도 이루어지며 이는 다음으로 변환됩니다. 상당히 임의적인 퍼지 요소를 사용하는 디스크 페이지 단위입니다. 만약에 이러한 요소를 실험하고 싶다면 목록을 참조하세요. 런타임 구성 매개변수섹션 17.6.2.)
상위 노드의 비용은 모든 하위 노드의 비용이 포함됩니다. 그것은 또한 중요하다 비용에는 기획자가 생각한 것만 반영된다는 사실을 깨닫기 위해 신경이 쓰인다. 특히 비용은 시간을 고려하지 않습니다. 결과 행을 클라이언트에 전송하는 데 소비되었습니다. 실제 경과 시간에 중요한 요소입니다. 하지만 기획자는 계획을 변경하여 변경할 수 없기 때문에 이를 무시합니다. (모든 올바른 계획은 동일한 행 집합을 출력합니다. 신뢰.)
행 출력은 약간 까다롭습니다.아님처리된 행 수 또는 계획 노드에서 스캔합니다. 일반적으로 더 적습니다. 임의의 예상 선택성어디에서-적용되는 절 조건 노드에서. 이상적으로 최상위 행 추정치는 실제로 반환, 업데이트 또는 행 수를 대략적으로 계산합니다. 쿼리에 의해 삭제되었습니다.
예로 돌아가기:
토토 사이트 선택 * FROM tenk1;
쿼리 계획
------------------------------------------------
tenk1의 시퀀스 스캔(비용=0.00..458.00행=10000너비=244)
이것은 매우 간단합니다. 그렇게 한다면
pg_class WHERE relname = 'tenk1'에서 relpages, reltuples 선택;
당신은 그것을 알게 될 것입니다텐크1에는 358개의 디스크 페이지와 10000개의 행이 있습니다. 따라서 비용은 다음과 같이 추정됩니다.
페이지 읽기 358회(개당 비용 1.0 + 10000 *로 정의됨)cpu_tuple_cost일반적으로 0.01입니다(시도해 보세요표시
cpu_tuple_cost).
이제 쿼리를 수정하여 다음을 추가하겠습니다.어디조건:
토토 사이트 선택 * FROM tenk1 WHERE 고유1 < 7000;
쿼리 계획
----------------------------------
tenk1의 시퀀스 스캔(비용=0.00..483.00행=7033너비=244)
필터: (고유1 < 7000)
다음에 주목하세요.토토 사이트출력 를 보여줍니다.어디절 적용 중 으로"필터"조건; 이것은 의미한다 계획 노드는 스캔하는 각 행의 조건을 확인합니다. 조건을 통과한 것만 출력합니다. 견적 의 출력 행이 다음으로 인해 다운되었습니다.어디절. 그러나 스캔에는 여전히 10000개의 행을 모두 방문하므로 비용이 감소하지 않습니다. 사실 소비된 추가 CPU 시간을 반영하기 위해 약간 증가했습니다. 확인 중어디조건.
이 쿼리가 선택하는 실제 행 수는 7000개입니다. 그러나 행 추정치는 대략적인 것입니다. 당신이하려고하면 이 실험을 반복하면 아마도 약간의 결과를 얻게 될 것입니다. 다른 견적; 게다가 매번 변경될 것입니다.분석명령이기 때문에 통계 생성자분석있습니다 테이블의 무작위 표본에서 가져온 것입니다.
이제 조건을 더욱 제한적으로 만들어 보겠습니다.
토토 사이트 선택 * FROM tenk1 WHERE 고유1 < 100;
쿼리 계획
----------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=2.37..232.35행=106너비=244)
조건 재확인: (unique1 < 100)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..2.37행=106너비=0)
인덱스 조건: (unique1 < 100)
여기서 기획자는 2단계 계획을 사용하기로 결정했습니다: 하단 계획 노드는 행의 위치를 찾기 위해 인덱스를 방문합니다. 인덱스 조건과 일치한 다음 상위 계획 노드 실제로 테이블 자체에서 해당 행을 가져옵니다. 가져오는 중 행을 개별적으로 처리하는 것이 순차적으로 수행하는 것보다 훨씬 비쌉니다. 읽어보지만 테이블의 모든 페이지에 방문하려면 순차 스캔보다 비용이 여전히 저렴합니다. (2단계 계획을 사용하는 이유는 상위 계획이 노드는 인덱스로 식별된 행 위치를 다음으로 정렬합니다. 비용을 최소화하기 위해 읽기 전에 물리적 순서를 따르십시오. 별도의 가져오기 중."비트맵"노드 이름에 언급된 것은 정렬을 수행하는 메커니즘입니다.)
만약에어디조건은 선택적입니다. 충분히, 플래너는 다음으로 전환할 수 있습니다."간단함"색인 스캔 계획:
토토 사이트 선택 * FROM tenk1 WHERE 고유1 < 3;
쿼리 계획
----------------------------------------------------
tenk1에서 tenk1_unique1을 사용하는 인덱스 스캔(비용=0.00..10.00행=2너비=244)
인덱스 조건: (unique1 < 3)
이 경우 테이블 행은 색인 순서대로 가져옵니다. 읽기 비용이 훨씬 더 많이 들지만, 행 위치를 정렬하는 데 추가 비용이 들지 않는 경우는 거의 없습니다. 그만한 가치가 있습니다. 다음과 같은 쿼리에 대해 이 계획 유형을 가장 자주 보게 될 것입니다. 단일 행만 가져오고, 요청하는 쿼리의 경우주문 기준다음과 일치하는 조건 색인 순서.
다음에 다른 조건 추가어디에서절:
토토 사이트 선택 * FROM tenk1 WHERE Unique1 < 3 AND stringu1 = 'xxx';
쿼리 계획
----------------------------------------------------
tenk1에서 tenk1_unique1을 사용하는 인덱스 스캔(비용=0.00..10.01행=1너비=244)
지수 조건: (unique1 < 3)
필터: (stringu1 = 'xxx'::name)
추가된 조건stringu1 = 'xxx'출력 행 추정치를 줄이지만 비용은 줄이지 않습니다. 왜냐하면 우리는 여전히 동일한 행 집합을 방문해야 하기 때문입니다. 공지사항 그stringu1절은 다음과 같을 수 없습니다. 인덱스 조건으로 적용됩니다(이 인덱스는 다음에만 있으므로고유1열). 대신 적용됩니다 인덱스로 검색된 행에 대한 필터로 사용됩니다. 따라서 비용 이 추가 금액을 반영하기 위해 실제로 약간 상승했습니다. 확인 중입니다.
여러 열에 인덱스가 사용된 경우어디, 플래너는 AND 또는 또는 인덱스의 조합:
토토 사이트 선택 * FROM tenk1 여기서 고유1 < 100 AND 고유2 9000;
쿼리 계획
------------------------------------------------------------------------
tenk1의 비트맵 힙 스캔(비용=11.27..49.11행=11너비=244)
조건을 다시 확인하세요: ((unique1 < 100) AND (unique2 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)
지수 조건: (unique2 9000)
그러나 이것은 두 색인을 모두 방문해야 하므로 그렇지 않습니다. 단 하나의 인덱스를 사용하고 처리하는 것에 비해 필연적으로 승리합니다. 다른 조건은 필터입니다. 범위를 다양하게 하면 관련 내용에 따라 계획이 변경되는 것을 확인하실 수 있습니다.
우리가 설정한 열을 사용하여 두 테이블을 결합해 보겠습니다. 논의 중:
토토 사이트 선택 * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
쿼리 계획
-------------------------------------------------------------------------
중첩 루프(비용=2.37..553.11행=106너비=488)
- tenk1 t1의 비트맵 힙 스캔(비용=2.37..232.35 행=106 너비=244)
조건 재확인: (unique1 < 100)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..2.37행=106너비=0)
지수 조건: (고유1 < 100)
- tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔(비용=0.00..3.01 행=1 너비=244)
인덱스 조건: ("outer".unique2 = t2.unique2)
이 중첩 루프 조인에서 외부 스캔은 동일한 비트맵입니다 앞에서 본 인덱스 스캔이므로 비용과 행 개수는 다음과 같습니다. 우리가 적용하고 있기 때문에 동일합니다.어디절고유1 < 100그 노드에서.t1.unique2 = t2.unique2절은 아직 관련이 없으므로 그렇지 않습니다. 외부 스캔의 행 수에 영향을 미칩니다. 내부 스캔의 경우,고유2현재의 가치 외부 스캔 행은 내부 인덱스 스캔에 연결되어 생성됩니다. 다음과 같은 인덱스 조건t2.unique2 =상수. 그래서 우리는 예를 들어, 우리가 얻을 수 있는 동일한 내부 스캔 계획 및 비용토토 사이트 선택 * FROM tenk2 WHERE 고유2 = 42. 루프 노드의 비용은 다음을 기준으로 설정됩니다. 외부 스캔 비용과 내부 스캔 1회 반복 비용 각 외부 행(여기서는 106 * 3.01)과 약간의 CPU를 스캔합니다. 조인 처리 시간입니다.
이 예에서 조인의 출력 행 개수는 다음과 같습니다. 두 스캔의 행 개수를 곱한 값이지만 이는 사실이 아닙니다. 일반적으로 일반적으로 다음을 가질 수 있기 때문입니다.어디두 테이블을 모두 언급하는 절 등 조인 포인트에만 적용할 수 있으며 두 입력에는 적용할 수 없습니다. 스캔. 예를 들어, 다음을 추가했다면어디에서 ... AND t1.백 < t2.백, 그러면 조인 노드의 행 수를 출력하지만 입력은 변경하지 않습니다. 스캔하다.
변형 계획을 보는 한 가지 방법은 계획자가 강제로 승자라고 생각되는 전략은 무엇이든 무시하고 다음을 사용합니다. 토토 사이트된 활성화/비활성화 플래그섹션 17.6.1. (이것은 조잡한 도구이지만 유용합니다. 또한 참조하십시오.PostgreSQL : 문서 : 8.1 : 명시 적 조인 조항으로 롤 토토 제어.)
SET 활성화_nestloop = 꺼짐;
토토 사이트 선택 * FROM tenk1 t1, tenk2 t2 여기서 t1.unique1 < 100 AND t1.unique2 = t2.unique2;
쿼리 계획
-----------------------------------------------------------------------------
해시 조인(비용=232.61..741.67행=106너비=488)
해시 조건: ("outer".unique2 = "inner".unique2)
- tenk2 t2의 시퀀스 스캔(비용=0.00..458.00 행=10000 너비=244)
- 해시(비용=232.35..232.35행=106너비=244)
- tenk1 t1의 비트맵 힙 스캔(비용=2.37..232.35 행=106 너비=244)
조건 재확인: (unique1 < 100)
- tenk1_unique1의 비트맵 인덱스 스캔(비용=0.00..2.37행=106너비=0)
인덱스 조건: (unique1 < 100)
이 계획은 100개의 흥미로운 행을 추출하는 것을 제안합니다.tenk1동일한 이전 색인 사용
스캔하여 메모리 내 해시 테이블에 저장한 다음
순차 스캔tenk2,
가능한 일치를 찾기 위해 해시 테이블을 조사합니다.t1.unique2 = t2.unique2각각tenk2행. 읽는 비용텐크1해시 테이블 설정은 전적으로
해시 조인의 시작 비용(행을 얻지 못하므로)
우리가 읽기 시작할 수 있을 때까지 기다리세요tenk2. 조인에 대한 총 예상 시간
또한 해시를 조사하는 데 소요되는 CPU 시간에 대한 막대한 요금도 포함됩니다.
테이블 10000 번. 그러나 우리는 다음과 같습니다.아님10000번 충전 232.35;
해시 테이블 설정은 이 계획 유형에서 한 번만 수행됩니다.
기획자의 정확성을 확인할 수 있습니다. 사용에 따른 예상 비용토토 사이트하세요 분석. 이 명령은 실제로 쿼리를 실행하고 그런 다음 각 계획 내에서 누적된 실제 실행 시간을 표시합니다. 일반 노드와 동일한 예상 비용과 함께 노드토토 사이트표시됩니다. 예를 들어, 다음과 같은 결과를 얻습니다:
토토 사이트 분석 선택 * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND 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)
조건 재확인: (unique1 < 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)
인덱스 조건: ("outer".unique2 = t2.unique2)
총 런타임: 14.452ms
참고하세요"실제 시간"값은 실시간의 밀리초 단위인 반면,"비용"추정치는 다음과 같이 표현됩니다. 임의의 디스크 가져오기 단위; 그래서 그들은 일치하지 않을 것 같습니다 위로. 주목해야 할 것은 비율입니다.
일부 쿼리 계획에서는 하위 계획 노드가 두 번 이상 실행되었습니다. 예를 들어 내부 인덱스 스캔은 다음과 같습니다. 위의 중첩 루프 계획에서 외부 행당 한 번씩 실행됩니다. 에서 그러한 경우에는"루프"값 노드의 총 실행 횟수를 보고합니다. 표시된 실제 시간 및 행 값은 실행당 평균입니다. 이는 숫자를 다음과 같은 방식으로 비교하기 위해 수행됩니다. 예상 비용이 표시됩니다. 를 곱한다"루프"실제로 총 시간을 가져오는 값 노드에서 소비되었습니다.
그총 런타임표시자:분석 토토 사이트실행자 포함 시작 및 종료 시간과 처리에 소요된 시간 결과 행. 구문 분석, 재작성 또는 작업은 포함되지 않습니다. 계획 시간. 에 대한선택질의, 총 실행 시간은 일반적으로 최상위 계획 노드에 대해 보고된 총 시간입니다. 에 대한삽입, 업데이트및삭제명령, 총 실행 시간 소요된 시간이 포함되어 있기 때문에 상당히 클 수 있습니다. 결과 행을 처리합니다. 이 명령에서는 최상위 계획 노드는 본질적으로 새로운 것을 계산하는 데 소요되는 시간입니다. 행 및/또는 이전 행을 찾지만 여기에는 변경하는 데 소요된 시간입니다. 트리거를 실행하는 데 소요된 시간(해당하는 경우) any도 최상위 계획 노드 외부에 있으며 별도로 표시됩니다. 각 트리거마다.
그것은 주목할 가치가 있습니다토토 사이트결과는 다음 이외의 상황으로 추정되어서는 안 됩니다. 실제로 테스트하고 있는 것; 예를 들어, 장난감 크기의 테이블은 큰 테이블에 적용된다고 가정할 수 없습니다. 는 기획자의 비용 추정은 선형적이지 않으므로 그럴 수도 있습니다. 더 크거나 작은 테이블에 대해서는 다른 계획을 선택하십시오. 안 극단적인 예는 하나의 디스크만 차지하는 테이블의 경우입니다. 페이지에서는 거의 항상 순차 스캔 계획을 얻게 됩니다. 인덱스를 사용할 수 있는지 여부. 기획자는 그걸 깨닫는다. 어떤 방식으로든 테이블을 처리하기 위해 하나의 디스크 페이지를 읽습니다. 이 경우 추가 페이지 읽기를 확장하는 것은 가치가 없습니다. 인덱스를 보세요.
| [1] |
이 섹션의 예는 회귀 분석에서 추출되었습니다. 다음을 수행한 후 데이터베이스 테스트진공 분석, 8.1 개발 소스 사용. 당신은 예제를 직접 시도해 보면 비슷한 결과를 얻을 수 있습니다. 하지만 예상 비용과 행 개수는 달라질 수 있습니다. 약간 때문에분석의 통계는 정확하지 않고 무작위 샘플입니다. |