가입절#명시적 구문을 사용하여 쿼리 플래너를 어느 정도 제어할 수 있습니다.가입구문. 이것이 왜 중요한지 알아보려면 먼저 몇 가지 배경 지식이 필요합니다.
다음과 같은 간단한 조인 쿼리에서:
SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id;
플래너는 주어진 테이블을 어떤 순서로든 자유롭게 조인할 수 있습니다. 예를 들어, 다음을 사용하여 A를 B에 조인하는 쿼리 계획을 생성할 수 있습니다.어디조건a.id = b.id, 그런 다음 다른 테이블을 사용하여 C를 이 조인된 테이블에 조인합니다.어디조건. 또는 B를 C에 결합한 다음 A를 해당 결과에 결합할 수도 있습니다. 또는 A를 C에 결합한 다음 B와 결합할 수도 있습니다. 그러나 이는 A와 C의 전체 데카르트 곱이 형성되어야 하기 때문에 비효율적입니다.어디조인 최적화를 허용하는 절입니다. (모든 조인은 다음과 같습니다.PostgreSQL실행자는 두 입력 테이블 사이에서 발생하므로 이러한 방식 중 하나로 결과를 구축해야 합니다.) 중요한 점은 이러한 다양한 스포츠 토토 사이트 가능성이 의미상으로는 동일한 결과를 제공하지만 실행 비용이 크게 다를 수 있다는 것입니다. 따라서 플래너는 가장 효율적인 쿼리 계획을 찾기 위해 모든 항목을 탐색합니다.
쿼리가 2~3개의 테이블만 포함하는 경우에는 걱정할 스포츠 토토 사이트 순서가 많지 않습니다. 그러나 테이블 수가 늘어남에 따라 가능한 스포츠 토토 사이트 순서의 수도 기하급수적으로 늘어납니다. 10개 정도의 입력 테이블을 넘어서면 모든 가능성을 철저하게 검색하는 것은 더 이상 실용적이지 않으며 6~7개 테이블의 경우에도 계획을 세우는 데 짜증스러울 만큼 오랜 시간이 걸릴 수 있습니다. 입력 테이블이 너무 많으면,PostgreSQL플래너는 전체 검색에서 a로 전환합니다.유전적제한된 수의 가능성을 통한 확률적 검색입니다. (전환 임계값은 다음에 의해 설정됩니다.geqo_threshold런타임 매개변수.) 유전자 검색에는 시간이 덜 걸리지만 반드시 최상의 계획을 찾는 것은 아닙니다.
쿼리가 외부 조인과 관련된 경우 플래너는 일반(내부) 조인보다 자유도가 낮습니다. 예를 들어 다음을 고려하세요.
SELECT * FROM a LEFT JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);
이 쿼리의 제한 사항은 표면적으로 이전 예와 유사하지만 B와 C의 조인에서 일치하는 행이 없는 A의 각 행에 대해 행을 내보내야 하기 때문에 의미 체계가 다릅니다. 따라서 플래너는 여기서 조인 순서를 선택할 수 없습니다. B를 C에 조인한 다음 A를 해당 결과에 조인해야 합니다. 따라서 이 쿼리는 이전 쿼리보다 계획하는 데 시간이 덜 걸립니다. 다른 경우에는 플래너가 둘 이상의 조인 순서가 안전하다고 판단할 수도 있습니다. 예를 들어, 다음과 같습니다:
SELECT * FROM a LEFT JOIN b ON (a.bid = b.id) LEFT JOIN c ON (a.cid = c.id);
먼저 A를 B 또는 C에 결합하는 것이 유효합니다. 현재는 만전체 스포츠 토토 사이트조인 순서를 완전히 제한합니다. 가장 실제적인 사례는 다음과 같습니다.왼쪽 스포츠 토토 사이트또는오른쪽 스포츠 토토 사이트어느 정도 재배열될 수 있습니다.
명시적 내부 스포츠 토토 사이트 구문(내부 스포츠 토토 사이트, 교차 스포츠 토토 사이트, 또는 장식되지 않은가입)은 의미상으로 입력 관계를 나열하는 것과 동일합니다.발신이므로 스포츠 토토 사이트 순서를 제한하지 않습니다.
비록 대부분의 종류의가입스포츠 토토 사이트 순서를 완전히 제한하지 마십시오. 지시할 수 있습니다.PostgreSQL모두 처리할 쿼리 플래너가입어쨌든 조인 순서를 제한하는 절입니다. 예를 들어 다음 세 가지 쿼리는 논리적으로 동일합니다.
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개뿐이면 걱정할 가치가 없지만, 테이블이 많으면 생명의 은인이 될 수 있습니다.
플래너가 명시적으로 배치된 스포츠 토토 사이트 순서를 따르도록 강제하기 위해가입s, 설정join_collapse_limit런타임 매개변수를 1로 설정합니다. (다른 가능한 값은 아래에서 설명합니다.)
검색 시간을 줄이기 위해 스포츠 토토 사이트 순서를 완전히 제한할 필요는 없습니다. 사용해도 괜찮기 때문입니다.가입일반 항목 내의 연산자발신목록. 예를 들어 다음을 고려하세요.
SELECT * CROSS JOIN b, c, d, e WHERE ...;
함께join_collapse_limit= 1, 이는 플래너가 A를 다른 테이블에 스포츠 토토 사이트하기 전에 A를 B에 스포츠 토토 사이트하도록 강제하지만 선택을 제한하지는 않습니다. 이 예에서는 가능한 스포츠 토토 사이트 순서 수가 5배로 줄어듭니다.
이러한 방식으로 플래너의 검색을 제한하는 것은 계획 시간을 줄이고 플래너에게 좋은 쿼리 계획을 안내하는 데 유용한 기술입니다. 플래너가 기본적으로 잘못된 조인 순서를 선택하는 경우 다음을 통해 더 나은 순서를 선택하도록 강제할 수 있습니다.가입구문 — 더 나은 순서를 알고 있다고 가정합니다. 실험을 권장합니다.
계획 시간에 영향을 미치는 밀접하게 관련된 문제는 하위 쿼리를 상위 쿼리로 축소하는 것입니다. 예를 들어 다음을 고려하세요.
선택 *
x, y에서,
    (SELECT * FROM a, b, c WHERE 무언가) AS ss
다른 곳은 어디인가요?
  이 상황은 스포츠 토토 사이트이 포함된 뷰를 사용할 때 발생할 수 있습니다. 보기의선택규칙이 뷰 참조 위치에 삽입되어 위와 유사한 쿼리가 생성됩니다. 일반적으로 플래너는 하위 쿼리를 상위 쿼리로 축소하려고 시도하여 다음을 생성합니다.
SELECT * FROM x, y, a, b, c WHERE 무언가 AND다른 것;
이렇게 하면 일반적으로 하위 쿼리를 별도로 계획하는 것보다 더 나은 계획이 됩니다. (예를 들어, 외부어디조건은 X를 A에 조인하면 먼저 A의 많은 행을 제거하여 하위 쿼리의 전체 논리적 출력을 구성할 필요가 없도록 하는 것과 같을 수 있습니다.) 그러나 동시에 계획 시간을 늘렸습니다. 여기에는 두 개의 개별 3방향 조인 문제를 대체하는 5방향 조인 문제가 있습니다. 가능성의 수가 기하급수적으로 증가하기 때문에 이는 큰 차이를 만듭니다. 플래너는 하위 쿼리를 축소하지 않음으로써 대규모 조인 검색 문제에 빠지지 않도록 노력합니다.from_collapse_limit 발신항목은 상위 쿼리로 이어집니다. 이 런타임 매개변수를 위아래로 조정하여 계획 시간과 계획 품질을 절충할 수 있습니다.
from_collapse_limit그리고join_collapse_limit거의 동일한 일을 하기 때문에 비슷한 이름이 붙었습니다. 하나는 플래너가 언제 할 것인지를 제어합니다.“평평하게 펴기”하위 쿼리 및 기타 명시적 조인을 평면화할 시기를 제어합니다. 일반적으로 다음 중 하나를 설정합니다.join_collapse_limit같음from_collapse_limit(명시적 조인과 하위 쿼리가 유사하게 작동하도록) 또는 설정join_collapse_limitto 1(명시적 스포츠 토토 사이트으로 스포츠 토토 사이트 순서를 제어하려는 경우) 그러나 계획 시간과 실행 시간 간의 균형을 미세 조정하려는 경우에는 다르게 설정할 수 있습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.