이 문서는 지원되지 않는 버전의 토토 커뮤니티을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 14.3. 명백한 토토 사이트 조항으로 플래너버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

11.3. 명시 적으로 플래너를 제어합니다 조인

시작토토 커뮤니티7.1 쿼리 플래너를 어느 정도 제어 할 수 있습니다. 명시 적 조인 구문 사용. 이것이 중요한 이유를 확인하기 위해 우리는 먼저 배경이 필요합니다.

예 : 간단한 조인 쿼리에서

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

플래너는 주어진 테이블에 어떤 순서로든 무료로 결합 할 수 있습니다. 을 위한 예를 들어, WHERE 절 A.ID = B.ID, 그리고 CINS C에 합류했습니다. 다른 where 절을 사용하여 표. 또는 B에 가입 할 수 있습니다 그런 다음 그 결과에 참여하십시오. 또는 A에 가입 한 다음 가입 할 수 있습니다. B와 함께하지만 전체적으로 비효율적입니다. A와 C의 직교 제품은 형성되어야합니다. 조인의 최적화를 허용하기 위해 조항에 적용 할 수 없습니다. (모두에 합류합니다.토토 커뮤니티실행자는 두 입력 테이블 사이에 발생하므로 필요합니다. 이 패션 중 하나 또는 다른 패션에 결과를 구축하십시오.) 중요한 점은 이러한 다른 합류 가능성이 제공한다는 것입니다 의미 적으로 동등한 결과이지만 크게 다를 수 있습니다 실행 비용. 따라서 플래너는 그들 모두를 탐험 할 것입니다 가장 효율적인 쿼리 계획을 찾으려고 노력하십시오.

쿼리에 2 ~ 3 개의 테이블 만 포함되면 많은 사람들이 걱정할 주문에 참여합니다. 그러나 가능한 가입의 수 테이블 수가 확장됨에 따라 주문은 기하 급수적으로 증가합니다. 10 개 정도의 입력 테이블을 넘어서 더 이상 실용적이지 않습니다. 모든 가능성에 대한 철저한 검색, 심지어 6 또는 7 개의 테이블 계획은 성가신 시간이 오래 걸릴 수 있습니다. 언제 입력 테이블이 너무 많습니다.토토 커뮤니티플래너가 전환됩니다 A에 대한 철저한 검색genetic제한된 수의 가능성을 통한 확률 검색. (스위치 오버 임계 값은에 의해 설정됩니다.geqo_threshold런타임 매개 변수에 설명되어 있습니다 그만큼관리자 안내서.) 유전자 검색은 시간이 덜 걸리지 만 반드시 최고를 찾을 수는 없습니다. 가능한 계획.

쿼리에 외부 결합이 포함되면 플래너는 훨씬 적습니다. 평범한 (내부) 가입에 대한 것보다 자유. 예를 들어, 고려하다

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

이 쿼리의 제한은 피상적으로 유사하지만 이전 예에 따라 의미론은 다르기 때문에 일치하는 행이없는 각 행에 행을 방출해야합니다. B와 C의 결합은 플래너에게 조인을 선택할 수 없습니다. 여기에서 주문하십시오 : B를 C에 가입 한 다음 A에 가입하여 해당 결과에 가입해야합니다. 따라서이 쿼리는 이전보다 계획하는 데 시간이 줄어 듭니다. 질문.

in토토 커뮤니티7.1, the 플래너는 모든 명시적인 조인 구문을 제한으로 취급합니다 논리적으로 필요하지는 않더라도 주문에 가입하십시오. 내부 결합에 대한 그러한 제약. 따라서 전부 이 쿼리는 동일한 결과를 제공합니다.

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);

두 번째와 세 번째는 첫 번째보다 계획하는 데 시간이 줄어 듭니다. 이 효과는 3 개의 테이블에 대해서만 걱정할 가치가 없습니다. 그러나 그것은 많은 테이블이있는 생명 의인이 될 수 있습니다.

조인 순서를 완전히 제한 할 필요가 없습니다. 가입 연산자를 사용해도 괜찮으므로 검색 시간을 줄이십시오. 목록에서 평원으로. 예를 들어,

선택 *에서 크로스 조인 B, C, D, E Where ...;에서 선택하십시오.

플래너가 다른 사람과 합류하기 전에 플래너가 A에 가입하도록 강요 테이블이지만 그렇지 않으면 선택을 제한하지는 않습니다. 이것에서 예를 들어, 가능한 조인 주문의 수는 5의 요인

복잡한 쿼리에 외부와 내부 결합이 혼합되어 있으면 플래너의 좋은 검색을 제한하고 싶지 않을 수도 있습니다. 외부 조인 내부의 내부 결합 순서. 당신은 그렇게 할 수 없습니다 Join Syntax에서 직접하지만 구문을 둘러 볼 수 있습니다. subSelect를 사용하여 제한. 예를 들어,

선택 *에서 d 왼쪽 조인
        (a, b, c where에서 * 선택 ...) ss로서
        에 (...);

여기, D 가입 D는 쿼리 계획의 마지막 단계 여야하지만 플래너는 다양한 가입 주문을 무료로 고려할 수 있습니다. 알파벳.

이러한 방식으로 플래너의 검색을 제한하는 것은 유용합니다. 계획 시간을 줄이고 지시하는 기술 좋은 쿼리 계획에 대한 플래너. 플래너가 나쁜 결합을 선택하는 경우 기본적으로 주문하면 구문 가입 --- 더 나은 순서를 알고 있다고 가정하면 이다. 실험이 권장됩니다.