이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 14.3. 명백한 토토 사이트 조항으로 플래너 제어버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

11.2. 명시적으로 플래너 제어 범퍼카 토토

다음으로 시작포스트그레스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 구문 --- 더 나은 순서를 알고 있다고 가정하면 이다. 실험을 권장합니다.