시작Postgres7.1 쿼리 플래너를 어느 정도 제어 할 수 있습니다. 명시 적 조인 구문 사용. 이것이 중요한 이유를 확인하기 위해 우리는 먼저 배경이 필요합니다.
간단한 범퍼카 토토 쿼리에서
선택 *에서 a, b, c에서 a.id = b.id 및 b.ref = c.id;에서 선택하십시오.플래너는 주어진 테이블에 어떤 순서로든 자유롭게 참여할 수 있습니다. 예를 들어, a to b에 가입하는 쿼리 계획을 생성 할 수 있습니다. WHERE 절을 사용하여 A.ID = B.ID를 사용한 다음 C에 가입하여 합류했습니다. 다른 where 절을 사용하여 표. 또는 B에 가입 할 수 있습니다 그런 다음 그 결과에 참여하십시오. 또는 A에 가입 한 다음 가입 할 수 있습니다. B와 함께하지만 전체적으로 비효율적입니다. A와 C의 직교 제품은 형성되어야합니다. 조인의 최적화를 허용하기 위해 조항에 적용 할 수 없습니다. (모두 에 가입Postgres집행자 두 입력 테이블 사이에 발생하므로 구축해야합니다. 이러한 패션 중 하나 또는 다른 패션을 초래합니다.) 중요한 점은 이러한 다른 결합 가능성은 의미 적으로 제공합니다 동등한 결과이지만 실행 비용이 크게 다를 수 있습니다. 따라서 플래너는 그들 모두를 탐색하여 가장 효율적인 쿼리 계획.
쿼리에 2 ~ 3 개의 테이블 만 포함되면 많은 사람들이 걱정할 주문에 참여합니다. 그러나 가능한 가입의 수 테이블 수가 확장됨에 따라 주문은 기하 급수적으로 증가합니다. 10 개 정도의 입력 테이블을 넘어서 더 이상 실용적이지 않습니다. 모든 가능성에 대한 철저한 검색, 심지어 6 또는 7 개의 테이블 계획은 성가신 시간이 오래 걸릴 수 있습니다. 언제 입력 테이블이 너무 많습니다.Postgres플래너는 철저한에서 전환됩니다 A 검색genetic확률 검색 제한된 수의 가능성을 통해. (전환 임계 값은 geqo_threshold 런타임 매개 변수에 의해 설정됩니다 설명관리자 안내서.) 유전자 검색은 시간이 줄어들지 만 반드시 찾을 수는 없습니다. 가능한 최고의 계획.
쿼리에 외부 범퍼카 토토이 포함되면 플래너는 훨씬 적습니다. 평범한 (내부) 가입에 대한 것보다 자유. 예를 들어, 고려하다
선택 * 왼쪽 범퍼카 토토 (b 범퍼카 토토 c On (b.ref = c.id)) on (a.id = b.id);이 쿼리의 제한은 피상적으로 유사하지만 앞의 예에 따라, 줄은 일치하는 행이없는 각 행에 대해 방출해야합니다. B와 C의 가입. 따라서 플래너는 조인 순서를 선택할 수 없습니다. 여기 : B를 C에 가입 한 다음 A에 가입하여 해당 결과에 가입해야합니다. 따라서이 쿼리는 이전보다 계획하는 데 시간이 줄어 듭니다. 질문.
inPostgres7.1, 플래너 모든 명시 적 조인 구문을 조인 순서 제한으로 취급하고 비록 그러한 내부 조인에 대한 제약. 그러므로이 모든 것 쿼리는 동일한 결과를 제공합니다.
선택 *에서 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 ...;에서 선택하십시오.Planner가 A에 참여하기 전에 B에 가입하도록 강요합니다. 다른 테이블이지만 그렇지 않으면 선택을 제한하지는 않습니다. 이것에서 예를 들어, 가능한 범퍼카 토토 주문 수는 요인만큼 감소합니다. 5.
복잡한 쿼리에 외부와 내부 결합이 혼합되어 있으면 플래너의 좋은 검색을 제한하고 싶지 않을 수도 있습니다. 외부 조인 내부의 내부 결합 순서. 당신은 그렇게 할 수 없습니다 Join Syntax에서 직접하지만 구문을 둘러 볼 수 있습니다. subSelect를 사용하여 제한. 예를 들어,
선택 *에서 d 왼쪽 범퍼카 토토 (a, b, c where에서 * 선택 ...) ss로서 에 (...);여기, D 가입 D는 쿼리 계획의 마지막 단계 여야하지만 플래너는 A, B, C.에 대한 다양한 범퍼카 토토 주문을 무료로 고려할 수 있습니다.
이런 식으로 플래너의 검색을 제한하는 것은 유용합니다. 계획 시간을 줄이고 지시하는 기술 좋은 쿼리 계획에 대한 플래너. 플래너가 나쁜 결합을 선택하는 경우 기본적으로 주문하면 구문 가입 --- 더 나은 순서를 알고 있다고 가정하면 이다. 실험이 권장됩니다.