Join
Clauses#명시 적 사용으로 쿼리 플래너를 어느 정도 제어 할 수 있습니다Join
구문. 이것이 중요한 이유를 확인하려면 먼저 배경이 필요합니다.
:과 같은 간단한 스포츠 토토 사이트 쿼리에서
선택 *에서 a, b, c 여기서 a.id = b.id 및 b.ref = c.id;
플래너는 주어진 테이블에 어떤 순서로든 무료로 결합 할 수 있습니다. 예를 들어,를 사용하여 a to b에 가입하는 쿼리 계획을 생성 할 수 있습니다.여기서
조건a.id = b.id
, 그런 다음 다른 테이블을 사용 하여이 결합 된 테이블에 C를 결합합니다여기서
조건. 또는 B에 C에 가입 한 다음 A에 가입하여 해당 결과에 참여할 수 있습니다. 또는 A에 가입 한 다음 B와 결합 할 수 있습니다. 그러나 A와 C의 전체 직교 제품이 형성되어야하므로에 적용 가능한 조건이 없기 때문에 비효율적입니다.여기서
스포츠 토토 사이트의 최적화를 허용하기위한 조항. (모두에 합류합니다.PostgreSQLexecutor는 두 입력 테이블 사이에 발생하므로 이러한 패션 중 하나 또는 다른 패션에서 결과를 구축해야합니다.) 이러한 중요한 점은 이러한 다른 결합 가능성이 의미 적으로 동등한 결과를 제공하지만 실행 비용이 크게 다를 수 있다는 것입니다. 따라서 플래너는 가장 효율적인 쿼리 계획을 찾기 위해 그들 모두를 탐색 할 것입니다.
쿼리에 2 ~ 3 개의 테이블 만 포함되면 걱정할 명령이 많지 않습니다. 그러나 테이블 수가 확장됨에 따라 가능한 스포츠 토토 사이트 주문 수는 기하 급수적으로 증가합니다. 10 개 정도의 입력 테이블을 넘어서 더 이상 모든 가능성을 철저하게 검색하는 것이 실용적이지 않으며 6 ~ 7 개의 테이블 계획조차도 성가신 시간이 오래 걸릴 수 있습니다. 입력 테이블이 너무 많으면PostgreSQLPlanner는 철저한 검색에서 a로 전환됩니다.genetic제한된 수의 가능성을 통한 확률 검색. (스위치 오버 임계 값은에 의해 설정됩니다.geqo_threshold런타임 매개 변수.) 유전자 검색은 시간이 줄어들지 만 반드시 가능한 최상의 계획을 찾을 수는 없습니다.
쿼리에 외부 결합이 포함되면 플래너는 평범한 (내부) 스포츠 토토 사이트보다 자유가 적습니다. 예를 들어, 고려 :
선택 * 왼쪽 스포츠 토토 사이트 (b 조인 c On (b.ref = c.id)) on (a.id = b.id);
이 쿼리의 제한은 이전 예제와 피상적으로 유사하지만 Semantics는 B와 C의 스포츠 토토 사이트에 일치하는 행이없는 각 행에 행이 방출되어야하기 때문에 Semantics가 다릅니다. 따라서 Planner는 BIN 순서를 선택하지 않아야합니다. B에 가입 한 다음 해당 결과에 가입해야합니다. 따라서이 쿼리는 이전 쿼리보다 계획하는 데 시간이 줄어 듭니다. 다른 경우, 플래너는 둘 이상의 결합 주문이 안전하다고 판단 할 수 있습니다. 예를 들어 주어진 :
선택 * 왼쪽에 가입 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; 크로스 스포츠 토토 사이트 B 크로스 스포츠 토토 사이트 C에서 *를 선택하십시오. 여기서 a.id = b.id 및 b.ref = c.id; (A.ID = B.ID); ON (A.ID = B.Id);
그러나 우리가 플래너에게 명예를 명예라고 말하면Join
순서, 두 번째와 세 번째는 첫 번째보다 계획하는 데 시간이 줄어 듭니다. 이 효과는 3 개의 테이블에 대해서만 걱정할 가치가 없지만 테이블이 많은 생명의 은인이 될 수 있습니다.
플래너가 명시 적으로 제시 한 스포츠 토토 사이트 명령을 따르도록 강요하려면Join
s, 설정join_collapse_limit런타임 매개 변수에서 1. (다른 가능한 값은 아래에 설명되어 있습니다.)
검색 시간을 줄이기 위해 스포츠 토토 사이트 순서를 완전히 제한 할 필요가 없습니다.Join
평원 항목 내의 운영자From
목록. 예를 들어, 고려 :
선택 *에서 크로스 스포츠 토토 사이트 B, C, D, E WHERE ...;에서 선택하십시오.
withjoin_collapse_limit
= 1, 이로 인해 플래너는 다른 테이블에 합류하기 전에 플래너가 A에 가입하도록 강요하지만 그렇지 않으면 선택을 제한하지는 않습니다. 이 예에서는 가능한 스포츠 토토 사이트 주문 수가 5의 계수로 줄어 듭니다.
이러한 방식으로 플래너의 검색을 제한하는 것은 계획 시간을 줄이고 플래너를 좋은 쿼리 계획으로 안내하는 데 유용한 기술입니다. 플래너가 기본적으로 불량 스포츠 토토 사이트 주문을 선택하면를 통해 더 나은 주문을 선택하도록 강요 할 수 있습니다.Join
구문 - 더 나은 순서를 알고 있다고 가정합니다. 실험이 권장됩니다.
계획 시간에 영향을 미치는 밀접하게 관련된 문제는 하위 쿼리를 부모 쿼리로 붕괴시키는 것입니다. 예를 들어, 고려 :
선택 * x, y, (a, b, c에서 * 선택) ss로서 something else;
이 상황은 스포츠 토토 사이트이 포함 된 견해를 사용하여 발생할 수 있습니다. The View 'select
규칙은보기 참조 대신 삽입되어 위와 같은 쿼리를 산출합니다. 일반적으로 플래너는 하위 쿼리를 부모로 붕괴 시키려고합니다.
선택 *에서 x, y, a, b, c 어디서 무언가와 무언가 else;
이것은 일반적으로 하위 쿼리를 개별적으로 계획하는 것보다 더 나은 계획을 초래합니다. (예를 들어, 외부여기서
조건은 x를 먼저 A에 연결하는 것이 A의 많은 행을 제거하여 하위 퀘스트의 전체 논리적 출력을 형성 할 필요가 없을 수 있습니다.) 동시에, 우리는 계획 시간을 증가 시켰습니다. 여기에는 두 개의 별도의 3 방향 조인 문제를 대체하는 5 방향 조인 문제가 있습니다. 가능성의 수의 기하 급수적 성장으로 인해 큰 차이가 발생합니다. 플래너는 하위 쿼리를 붕괴시키지 않음으로써 큰 가입 검색 문제에 갇히지 않기 위해from_collapse_limit
From
항목으로 인해 상위 쿼리가 발생합니다. 이 런타임 매개 변수를 위 또는 아래로 조정하여 계획 품질에 대해 계획 시간을 트레이드 할 수 있습니다.
from_collapse_limitandjoin_collapse_limit거의 같은 일을하기 때문에 비슷하게 이름이 지정됩니다. 플래너가 할 때 제어합니다“평평한”하위 쿼리 및 다른 컨트롤이 명시 적 스포츠 토토 사이트을 평평하게 할 때 다른 컨트롤이 있습니다. 일반적으로 당신은 설정합니다join_collapse_limit
동일from_collapse_limit
(따라서 명백한 조인 및 하위 쿼리가 비슷하게 행동하도록) 또는 설정join_collapse_limit
to 1 (명시 적 스포츠 토토 사이트으로 순서가 결합 된 경우). 그러나 계획 시간과 실행 시간 간의 트레이드 오프를 미세 조정하려고한다면 다르게 설정할 수 있습니다.