다음으로 시작포스트그레스7.1 쿼리 플래너를 어느 정도 제어하는 것이 가능합니다. 명시적인 JOIN 구문을 사용합니다. 이것이 왜 중요한지 알아보기 위해 먼저 배경 지식이 필요합니다.
다음과 같은 간단한 조인 쿼리에서
SELECT * FROM a,b,c WHERE a.id = b.id AND b.ref = c.id;플래너는 주어진 테이블을 어떤 순서로든 자유롭게 조인할 수 있습니다. 예를 들어 A를 B에 조인하는 쿼리 계획을 생성할 수 있습니다. WHERE 절 a.id = b.id를 사용하고 C를 이 조인에 조인합니다. 다른 WHERE 절을 사용하여 테이블. 아니면 B를 C에 결합할 수도 있고 그런 다음 A를 해당 결과에 결합하세요. 아니면 A를 C에 결합한 다음 결합할 수도 있습니다. B와 함께 --- 하지만 그것은 비효율적입니다. A와 C의 데카르트 곱이 형성되어야 합니다. 조인 최적화를 허용하는 적용 가능한 WHERE 절이 없습니다. (모두 에 조인함포스트그레스집행자 두 입력 테이블 사이에서 발생하므로 이러한 패션 중 하나 또는 다른 결과가 발생합니다.) 중요한 점은 이러한 다양한 범퍼카 토토 가능성은 의미상으로 제공됩니다. 결과는 동일하지만 실행 비용이 크게 다를 수 있습니다. 그러므로 기획자는 그 모든 것을 탐색하여 가장 효율적인 쿼리 계획입니다.
쿼리가 2~3개의 테이블만 포함하는 경우에는 많은 가입 주문이 걱정됩니다. 그러나 가능한 범퍼카 토토 수는 테이블 수가 늘어남에 따라 주문도 기하급수적으로 늘어납니다. 10개 정도의 입력 테이블을 넘어서는 것은 더 이상 실용적이지 않습니다. 모든 가능성에 대한 철저한 검색, 심지어 6개 이상의 가능성까지 7개의 테이블을 계획하는 데는 짜증스러울 정도로 오랜 시간이 걸릴 수 있습니다. 언제 입력 테이블이 너무 많습니다.포스트그레플래너가 전체 계획에서 전환됩니다. a로 검색하세요유전적확률적 검색 제한된 수의 가능성을 통해. (전환은 임계값은 GEQO_THRESHOLD 런타임 매개변수에 의해 설정됩니다. 에 설명되어 있습니다.관리자 가이드.) 유전자 검색은 시간이 덜 걸리지만 반드시 찾을 수는 없습니다. 최선의 계획입니다.
쿼리가 외부 범퍼카 토토과 관련된 경우 플래너는 훨씬 적은 양의 일반(내부) 범퍼카 토토보다 자유로워집니다. 예를 들어, 고려하다
SELECT * FROM a LEFT JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);이 쿼리의 제한 사항은 표면적으로 유사하지만 이전 예와는 행이 다르기 때문에 의미가 다릅니다. 일치하는 행이 없는 A의 각 행에 대해 방출되어야 합니다. B와 C의 조인. 따라서 플래너는 조인 순서를 선택할 수 없습니다. 여기서는 B를 C에 결합한 다음 A를 해당 결과에 결합해야 합니다. 따라서 이 쿼리는 이전 쿼리보다 계획하는 데 시간이 덜 걸립니다. 쿼리.
에포스트그레7.1, 기획자 모든 명시적 JOIN 구문을 조인 순서를 제한하는 것으로 간주합니다. 비록 그런 일을 하는 것이 논리적으로 필요하지 않더라도 내부 조인에 대한 제약 조건. 그러므로 이 모든 것에도 불구하고 쿼리는 동일한 결과를 제공합니다.
SELECT * FROM a,b,c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);두 번째와 세 번째는 첫 번째보다 계획하는 데 시간이 덜 걸립니다. 이 효과는 단지 3개의 테이블에 대해서는 걱정할 가치가 없지만, 테이블이 많으면 생명의 은인이 될 수 있습니다.
범퍼카 토토 순서를 완전히 제한할 필요는 없습니다. JOIN 연산자를 사용해도 괜찮으므로 검색 시간을 단축하세요. 일반 FROM 목록에 있습니다. 예를 들어,
SELECT * CROSS JOIN b, c, d, e WHERE ...;계획자가 A를 B에 합류시키기 전에 A를 B에 합류시키도록 강제합니다. 다른 테이블과 달리 선택을 제한하지 않습니다. 이에 예를 들어 가능한 범퍼카 토토 주문 수가 한 요소만큼 줄어듭니다. 5개 중
복잡한 쿼리에 외부 범퍼카 토토과 내부 범퍼카 토토이 혼합되어 있는 경우, 기획자의 상품 검색을 제한하고 싶지 않을 수도 있습니다. 외부 범퍼카 토토 내부의 내부 범퍼카 토토 순서. 당신은 그렇게 할 수 없습니다 JOIN 구문에서 직접 사용할 수 있지만 구문을 우회할 수 있습니다. 하위 선택을 사용하여 제한합니다. 예를 들어,
SELECT * FROM d LEFT JOIN
(SELECT * FROM a, b, c WHERE ...) AS ss
켜기(...);여기서 D에 합류하는 것은 쿼리 계획의 마지막 단계여야 하지만
플래너는 A,B,C에 대한 다양한 범퍼카 토토 순서를 자유롭게 고려할 수 있습니다.이러한 방식으로 계획자의 검색을 제한하는 것은 유용합니다. 계획 시간을 단축하고 방향을 잡는 기술 좋은 쿼리 계획을 세우는 플래너입니다. 플래너가 잘못된 조인을 선택한 경우 기본적으로 주문을 수행하면 다음을 통해 더 나은 주문을 선택하도록 강제할 수 있습니다. JOIN 구문 --- 더 나은 순서를 알고 있다고 가정하면 이다. 실험을 권장합니다.