다음으로 시작포스트그레SQL7.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 절이 없습니다. (모든 조인은 다음과 같습니다.포스트그레SQLexecutor는 두 입력 테이블 사이에서 발생하므로 다음이 필요합니다. 이러한 방식 중 하나 또는 다른 방식으로 결과를 구축합니다.) 중요한 점은 이러한 다양한 조인 가능성이 의미상으로는 동일한 결과이지만 크게 다를 수 있음 실행 비용. 그러므로 기획자는 그 모든 것을 탐구할 것이다. 가장 효율적인 쿼리 계획을 찾으려고 노력합니다.
쿼리가 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를 해당 결과에 결합해야 합니다. 따라서 이 쿼리는 이전 쿼리보다 계획하는 데 시간이 덜 걸립니다. 쿼리.
에포스트그레SQL7.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 구문 --- 더 나은 순서를 알고 있다고 가정하면 이다. 실험을 권장합니다.