쿼리 롤 토토를 어느 정도 제어 할 수 있습니다. 명시 적 사용Join구문. 보려면 이것이 중요한 이유, 우리는 먼저 약간의 배경이 필요합니다.
:과 같은 간단한 조인 쿼리에서
선택 *에서 a, b, c에서 a.id = b.id 및 b.ref = c.id;에서 선택하십시오.
롤 토토는 주어진 테이블에 어떤 순서로든 무료로 결합 할 수 있습니다. 을 위한 예를 들어, 그만큼여기서조건a.id = b.id, 그리고 C를 결합하여 합류했습니다 테이블, 다른 것을 사용여기서조건. 또는 B에 C에 가입 한 다음 A에 가입하여 해당 결과에 참여할 수 있습니다. 아니면 A에 가입 한 다음 B와 함께 할 수 있습니다. A와 C의 전체 직교 제품이 형성되어야합니다.여기서최적화를 허용하는 조항 가입. (모두에 합류합니다.PostgreSQL실행자는 두 입력 사이에 발생합니다 테이블이므로 결과를 하나 또는 이 패션 중 하나는 다른 결합 가능성은 의미 적으로 동등한 결과를 제공합니다 그러나 실행 비용이 크게 다를 수 있습니다. 따라서, 롤 토토는 가장 많이 찾기 위해 그들 모두를 탐험 할 것입니다. 효율적인 쿼리 계획.
쿼리에 2 ~ 3 개의 테이블 만 포함되면 많은 사람들이 걱정할 주문에 참여합니다. 그러나 가능한 가입의 수 테이블 수가 확장됨에 따라 주문은 기하 급수적으로 증가합니다. 10 개 정도의 입력 테이블을 넘어서 더 이상 실용적이지 않습니다. 모든 가능성에 대한 철저한 검색, 심지어 6 또는 7 개의 테이블 계획은 성가신 시간이 오래 걸릴 수 있습니다. 언제 입력 테이블이 너무 많습니다.PostgreSQL롤 토토가 전환됩니다 A에 대한 철저한 검색genetic제한된 수의 가능성을 통한 확률 검색. (스위치 오버 임계 값은에 의해 설정됩니다.geqo_threshold런타임 매개 변수.) 유전자 검색은 시간이 덜 걸리지 만 반드시 최상의 계획을 찾을 수는 없습니다.
쿼리에 외부 결합이 포함되면 롤 토토는 적습니다. 평범한 (내부) 가입에 대한 것보다 자유. 예를 들어, 고려하다:
선택 * 왼쪽 조인 (b 조인 c On (b.ref = c.id)) on (a.id = b.id);
이 쿼리의 제한은 피상적으로 유사하지만 이전 예에 따라 의미론은 다르기 때문에 일치하는 행이없는 각 행에 행을 방출해야합니다. B와 C의 결합은 플래너에게 조인을 선택할 수 없습니다. 여기에서 주문하십시오 : B를 C에 가입 한 다음 A에 가입하여 해당 결과에 가입해야합니다. 따라서이 쿼리는 이전보다 계획하는 데 시간이 줄어 듭니다. 질문. 다른 경우, 플래너는 하나 이상의 가입 주문은 안전합니다. 예를 들어 주어진 :
선택 * 왼쪽에 가입 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 개의 테이블이지만 많은 사람들이있는 생명의 은인이 될 수 있습니다. 테이블.
롤 토토가 제시 한 조인 명령을 따르도록 강요합니다. 명백한Joins, 설정join_collapse_limit런타임 매개 변수는 1입니다 (다른 가능한 값이 논의됩니다 아래에.)
16620_16731Join평원 항목 내의 운영자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의 많은 행을 제거하므로 형성 할 필요가 없습니다. 하위 퀘스트의 전체 논리 출력.) 동시에, 우리는 계획 시간을 늘 렸습니다. 여기에는 5 방향이 있습니다 두 개의 별도 3 방향 조인 문제를 대체하는 문제가 결합됩니다. 가능성 수의 기하 급수적 인 성장으로 인해 이것은 큰 차이를 만듭니다. 플래너는 얻는 것을 피하려고합니다 하위 쿼리를 무너 뜨리지 않음으로써 큰 가입 검색 문제에 갇혀 더 이상from_collapse_limit From항목은 부모가됩니다 질문. 계획 품질에 대해 계획 시간을 거래 할 수 있습니다. 이 런타임 매개 변수를 위 또는 아래로 조정합니다.
from_collapse_limitandjoin_collapse_limit거의 똑같은 일을하기 때문에 비슷하게 이름이 지정됩니다. 롤 토토가있을 때 컨트롤"평평합니다 밖으로"하위 쿼리 및 다른 컨트롤이 될 때 제어합니다 명백한 결합을 평평하게하십시오. 일반적으로 당신은 설정합니다join_collapse_limit동일from_collapse_limit(따라서 명시 적 합류 및 하위 쿼리는 비슷하게 행동) 또는 설정join_collapse_limit~ 1 (제어하려는 경우 명시 적 조인과 함께 주문). 그러나 당신은 그들을 설정할 수 있습니다 다르게 계획 시간과 달리기 시간.