14.3. 명시 적으로 플래너 제어JoinClauses

명시 적 사용으로 쿼리 플래너를 어느 정도 제어 할 수 있습니다Join구문. 이것이 중요한 이유를 확인하려면 먼저 배경이 필요합니다.

:과 같은 간단한 토토 사이트 쿼리에서

선택 *에서 a, b, c에서 a.id = b.id 및 b.ref = c.id;에서 선택하십시오.

플래너는 주어진 테이블에 어떤 순서로든 자유롭게 참여할 수 있습니다. 예를 들어,를 사용하여 a to b에 가입하는 쿼리 계획을 생성 할 수 있습니다.여기서조건a.id = b.id, 그런 다음 다른 테이블을 사용 하여이 결합 된 테이블에 C를 결합합니다여기서조건. 또는 B에 C에 가입 한 다음 A에 가입하여 해당 결과에 참여할 수 있습니다.여기서토토 사이트의 최적화를 허용하기위한 조항. (모두에 합류합니다.postgresqlexecutor는 두 입력 테이블 사이에 발생하므로 이러한 패션 중 하나 또는 다른 패션에서 결과를 구축해야합니다.) 이러한 중요한 요점은 이러한 다른 결합 가능성이 의미 적으로 동등한 결과를 제공하지만 실행 비용이 크게 다를 수 있다는 것입니다. 따라서 플래너는 가장 효율적인 쿼리 계획을 찾기 위해 그들 모두를 탐색 할 것입니다.

쿼리에 2 ~ 3 개의 테이블 만 포함되면 걱정할 명령이 많지 않습니다. 그러나 테이블 수가 확장됨에 따라 가능한 토토 사이트 주문 수는 기하 급수적으로 증가합니다.postgresqlPlanner는 철저한 검색에서 A로 전환됩니다genetic제한된 수의 가능성을 통한 확률 검색. (스위치 오버 임계 값은에 의해 설정됩니다.geqo_threshold런타임 매개 변수.) 유전자 검색은 시간이 줄어들지 만 반드시 가능한 최상의 계획을 찾을 수는 없습니다.

쿼리에 외부 결합이 포함되면 플래너는 평범한 (내부) 토토 사이트보다 자유가 적습니다. 예를 들어, 고려 :

선택 * 왼쪽 토토 사이트 (b 조인 C on (b.ref = c.id)) on (a.id = b.id);

이 쿼리의 제한은 이전 예제와 표면적으로 유사하지만 Semantics는 B와 C의 조인에 일치하는 행이없는 각 행에 행을 방출해야하기 때문에 Semantics가 다릅니다. 따라서 Planner는 BIN 순서를 선택하지 않아야합니다. 여기에 B에 가입해야합니다. 따라서이 쿼리는 이전 쿼리보다 계획하는 데 시간이 줄어 듭니다.

선택 * 왼쪽 join b on (a.bid = b.id) left c on (a.cid = c.id);

a에 b 또는 c에 합류하는 것이 유효합니다. 현재 만전체 토토 사이트토토 사이트 순서를 완전히 제한합니다. 관련된 대부분의 실용 사례왼쪽 토토 사이트또는오른쪽 토토 사이트어느 정도 재 배열 될 수 있습니다.

명시 적 내부 토토 사이트 구문 (내부 토토 사이트, 크로스 토토 사이트또는 undornedJoin)는 의미 적으로 입력 관계를 나열하는 것과 동일합니다.From, 그래서 토토 사이트 순서를 제한하지 않습니다.

비록 대부분의 종류의Join토토 사이트 순서를 완전히 제한하지 마십시오.postgresql모든 것을 치료하려는 쿼리 플래너Join어쨌든 토토 사이트 순서를 제한하는 조항. 예를 들어이 세 가지 쿼리는 논리적으로 동일합니다.

선택 *에서 a, b, c에서 a.id = b.id 및 b.ref = c.id;

그러나 우리가 플래너에게 명예를 명예라고 말하면Join순서, 두 번째와 세 번째는 첫 번째보다 계획하는 데 시간이 줄어 듭니다. 이 효과는 3 개의 테이블에 대해서만 걱정할 가치가 없지만 테이블이 많은 생명의 은인이 될 수 있습니다.

Planner가 명시 적으로 명시된 토토 사이트 명령을 따르도록 강요하려면Joins, setjoin_collapse_limit런타임 매개 변수에서 1.

검색 시간을 줄이기 위해 토토 사이트 순서를 완전히 제한 할 필요가 없습니다.Join평원 항목 내의 운영자From목록. 예를 들어, 고려 :

선택 *에서 크로스 토토 사이트 B, C, D, E Where ...;에서 선택하십시오.

withjoin_collapse_limit= 1, 이로 인해 플래너는 다른 테이블에 합류하기 전에 플래너가 A에 가입하도록 강요하지만 그렇지 않으면 선택을 제한하지는 않습니다. 이 예에서는 가능한 토토 사이트 주문 수가 5의 계수로 줄어 듭니다.

이러한 방식으로 플래너의 검색을 제한하는 것은 계획 시간을 줄이고 플래너를 좋은 쿼리 계획으로 안내하는 데 유용한 기술입니다. 플래너가 기본적으로 불량 토토 사이트 주문을 선택하면를 통해 더 나은 주문을 선택하도록 강요 할 수 있습니다.Join구문 - 더 나은 순서를 알고 있다고 가정합니다. 실험이 권장됩니다.

계획 시간에 영향을 미치는 밀접하게 관련된 문제는 하위 쿼리를 부모 쿼리로 붕괴시키는 것입니다. 예를 들어, 고려 :

선택 *

이 상황은 토토 사이트이 포함 된 견해를 사용하여 발생할 수 있습니다. The View 'select규칙은보기 참조 대신 삽입되어 위와 같은 쿼리를 산출합니다. 일반적으로 플래너는 하위 쿼리를 부모로 붕괴 시키려고합니다.

선택 *에서 x, y, a, b, c 위치와 무언가 else;

이것은 일반적으로 하위 쿼리를 개별적으로 계획하는 것보다 더 나은 계획을 초래합니다. (예를 들어, 외부여기서조건은 X를 처음으로 결합하는 것이 A의 많은 행을 제거하여 하위 퀘스트의 전체 논리적 출력을 형성 할 필요가 없을 수 있습니다.) 동시에, 우리는 계획 시간을 증가 시켰습니다. 여기에는 두 개의 별도의 3 방향 조인 문제를 대체하는 5 방향 조인 문제가 있습니다.from_collapse_limit From항목으로 인해 상위 쿼리가 발생합니다. 이 런타임 매개 변수를 위 또는 아래로 조정하여 계획 품질에 대해 계획 시간을 트레이드 할 수 있습니다.

from_collapse_limitjoin_collapse_limit거의 같은 일을하기 때문에 비슷하게 이름이 지정됩니다. 플래너가 할 때 제어합니다평평한하위 쿼리 및 다른 컨트롤이 명백한 결합을 평평하게 할 때 다른 컨트롤이 있습니다. 일반적으로 당신은 설정합니다join_collapse_limit동일from_collapse_limit(따라서 명백한 조인 및 하위 쿼리가 비슷하게 행동하도록) 또는 설정join_collapse_limitto 1 (명시 적 토토 사이트과의 순서를 제어하려면). 그러나 계획 시간과 실행 시간 간의 트레이드 오프를 미세 조정하려고한다면 다르게 설정할 수 있습니다.

정정 제출

올바른 문서에 아무것도 보이면 일치하지 않습니다.이 양식문서 문제를보고하려면