Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 무지개 토토 사용하는 무지개 토토 | up | 14 장. 성능 팁 | PostgreSQL : 문서 : 9.3 : 범퍼카 토토베이스를 채우는 |
쿼리 젠 토토를 어느 정도 제어 할 수 있습니다. 명시 적 사용Join구문. 이유를 확인합니다 문제가 중요합니다. 먼저 배경이 필요합니다.
:과 같은 간단한 조인 쿼리에서
선택 *에서 a, b, c에서 a.id = b.id 및 b.ref = c.id;에서 선택하십시오.
젠 토토는 주어진 테이블에 어떤 순서로든 자유롭게 참여할 수 있습니다. 을 위한 예를 들어, 그만큼여기서조건a.id = b.id, 그런 다음 C를이 결합 된 테이블에 가입시킵니다. 다른 사람 사용여기서조건. 아니면 B에 C에 가입 한 다음 A에 합류 할 수 있습니다. 또는 가입 할 수 있습니다 A에서 C로 B와 합류합니다. 그러나 그것은 비효율적입니다. A와 C의 전체 직교 제품은 형성,에는 적용 가능한 조건이 없습니다.여기서조인의 최적화를 허용하기위한 조항. (모두 에 가입PostgreSQL집행자 두 입력 테이블 사이에 발생하므로 구축해야합니다. 이러한 패션 중 하나 또는 다른 패션을 초래합니다.) 중요한 점은 이러한 다른 결합 가능성은 의미 적으로 제공합니다 동등한 결과이지만 실행 비용이 크게 다를 수 있습니다. 따라서 젠 토토는 그들 모두를 탐색하여 가장 효율적인 쿼리 계획.
쿼리에 2 ~ 3 개의 테이블 만 포함되면 많은 사람들이 걱정할 주문에 참여합니다. 그러나 가능한 가입의 수 테이블 수가 확장됨에 따라 주문은 기하 급수적으로 증가합니다. 그 너머에 10 개 정도의 입력 테이블 더 이상 철저한 일을하는 것이 실용적이지 않습니다. 모든 가능성 및 심지어 6 ~ 7 개의 테이블에 대한 검색 계획은 성가신 시간이 오래 걸릴 수 있습니다. 도있을 때 많은 입력 테이블,PostgreSQLPlanner는 철저한 검색에서 A로 전환됩니다.genetic한정을 통한 확률 검색 가능성의 수. (스위치 오버 임계 값은에 의해 설정됩니다.geqo_threshold런타임 매개 변수.) 유전자 검색은 시간이 덜 걸리지 만 반드시 최상의 계획을 찾을 수는 없습니다.
쿼리에 외부 조인이 포함되면 젠 토토는 적습니다. 평범한 (내부) 가입에 대한 것보다 자유. 예를 들어, 고려하다:
선택 *에서 왼쪽 조인 (b 조인 c On (b.ref = c.id)) on (a.id = b.id);
이 쿼리의 제한은 피상적으로 유사합니다 앞의 예, Semantics는 줄이기 때문에 다릅니다. 일치하는 행이없는 각 행에 대해 방출해야합니다. B와 C의 가입. 따라서 젠 토토는 조인 순서를 선택할 수 없습니다. 여기 : B를 C에 가입 한 다음 A에 가입하여 해당 결과에 가입해야합니다. 따라서이 쿼리는 이전보다 계획하는 데 시간이 줄어 듭니다. 질문. 다른 경우, 젠 토토는 하나 이상의 가입 주문이 안전합니다. 예를 들어 주어진 :
선택 * 왼쪽에 가입 b on (a.bid = b.id) left c on (a.cid = c.id);
a에 b 또는 c에 합류하는 것이 유효합니다. 현재 만전체 조인가입을 완전히 제한합니다 주문하다. 관련된 대부분의 실용 사례왼쪽 가입하다또는오른쪽 조인재 배열 될 수 있습니다 어느 정도까지.
명시 적 내부 조인 구문 (내부 조인, 크로스 조인또는 undornedJoin)는 의미 적으로 입력을 나열하는 것과 동일합니다 관계From이므로 그렇지 않습니다 조인 순서를 제한하십시오.
비록 대부분의 종류의Join하지 마십시오 조인 순서를 완전히 제한하면를 지시 할 수 있습니다.postgresql치료할 쿼리 젠 토토 모두Join15428_15536
선택 *에서 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);
그러나 우리가 젠 토토에게 명예를 명예라고 말하면Join순서, 두 번째와 세 번째는 시간이 줄어 듭니다 첫 번째보다 계획하십시오. 이 효과는 걱정할 가치가 없습니다 3 개의 테이블 만 있지만 테이블이 많은 생명 의인이 될 수 있습니다.
젠 토토가 제시 한 조인 명령을 따르도록 강요합니다. 명백한Joins, 설정join_collapse_limit런타임 매개 변수는 1입니다. (다른 가능한 값이 논의됩니다 아래에.)
순서대로 조인 순서를 완전히 제한 할 필요가 없습니다. 사용해도 괜찮기 때문에 검색 시간을 줄이려면Join평원 항목 내의 운영자From목록. 예를 들어, 고려 :
선택 *에서 크로스 조인 B, C, D, E WHERE ...;에서 선택하십시오.
withjoin_collapse_limit= 1, 이것 젠 토토가 다른 사람과 합류하기 전에 젠 토토가 A에 가입하도록 강요합니다. 테이블이지만 그렇지 않으면 선택을 제한하지는 않습니다. 이것에서 예를 들어, 가능한 조인 주문 수는 요인만큼 감소합니다. 5.
이러한 방식으로 젠 토토의 검색을 제한하는 것은 유용합니다. 계획 시간을 줄이고 지시하는 기술 좋은 쿼리 계획에 대한 젠 토토. 젠 토토가 나쁜 결합을 선택하는 경우 기본적으로 주문하면를 통해 더 나은 순서를 선택하도록 강요 할 수 있습니다.Join구문 - a를 알고 있다고 가정합니다 더 나은 순서입니다. 실험이 권장됩니다.
계획 시간에 영향을 미치는 밀접하게 관련된 문제는 무너지고 있습니다. 부모 쿼리에 대한 하위 쿼리. 예를 들어, 고려 :
선택 * x, y, (a, b, c에서 * 선택) ss로서 something else;
이 상황은 가입하다; The View 'select규칙이 될 것입니다 보기 참조 대신에 삽입하여 쿼리를 많이 산출합니다. 위. 일반적으로 젠 토토는 하위 퀘스트를 붕괴 시키려고합니다 부모에게 :
선택 *에서 x, y, a, b, c 어디서 무언가와 무언가 else;
이것은 일반적으로 하위 퀘스트를 계획하는 것보다 더 나은 계획을 초래합니다. 갈라져. (예를 들어, 외부여기서조건은 X를 먼저 결합시키는 것이 많은 것을 제거 할 수 있습니다. A의 행, 따라서 전체 논리 출력을 형성 할 필요가 없습니다. 하위 퀘스트의.) 그러나 동시에, 우리는 계획 시간; 여기, 우리는 두 가지를 대체하는 5 방향 조인 문제가 있습니다 별도의 3 방향 조인 문제. 기하 급수적 인 성장으로 인해 가능성의 수에서 이것은 큰 차이를 만듭니다. 그만큼 Planner는 큰 가입 검색 문제에 갇히지 않기 위해 노력합니다. 하위 쿼리를 무너 뜨리지 않음from_collapse_limit From항목으로 인해 상위 쿼리가 발생합니다. 당신은 계획을 거래 할 수 있습니다 이 런타임 매개 변수를 조정하여 계획 품질에 대한 시간 위 또는 아래로.
from_collapse_limitandjoin_collapse_limit거의 똑같은 일을하기 때문에 비슷하게 명명되었습니다. 젠 토토가있을 때 컨트롤"평평합니다 밖으로"하위 쿼리 및 다른 컨트롤은 평평해질 때입니다 명백한 가입. 일반적으로 당신은 설정합니다join_collapse_limit동일from_collapse_limit(따라서 명백한 결합 및 하위 쿼리는 비슷하게 행동) 또는 설정join_collapse_limit~ 1 (제어하려는 경우 명시 적 조인과 함께 주문). 그러나 당신은 그것들을 다르게 설정할 수 있습니다 계획 시간 간의 상충 관계를 미세 조정하려는 경우 그리고 런타임.
이전 | 배트맨 젠 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | PostgreSQL : 문서 : 9.3 : 범퍼카 토토베이스를 채우는 |
입안자 | up | 채워진 a 데이터 베이스 |