| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 무지개 토토 사용하는 무지개 토토 | 위로 | 14장. 성능 팁 | PostgreSQL : 문서 : 9.3 : 범퍼카 토토베이스를 채우는 | |
다음을 통해 쿼리 플래너를 어느 정도 제어할 수 있습니다. 명시적인 사용가입구문. 이유를 보려면 이것이 중요합니다. 먼저 배경 지식이 필요합니다.
다음과 같은 간단한 조인 쿼리에서:
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개의 테이블까지 검색합니다. 계획을 세우는 데 짜증스러울 정도로 오랜 시간이 걸릴 수 있습니다. 너무 있을 때 많은 입력 테이블,포스트그레SQL젠 토토는 전체 검색에서 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를 해당 결과에 결합해야 합니다. 따라서 이 쿼리는 이전 쿼리보다 계획하는 데 시간이 덜 걸립니다. 쿼리. 다른 경우에는 기획자가 다음 사항을 결정할 수도 있습니다. 둘 이상의 조인 순서가 안전합니다. 예를 들어, 다음과 같습니다:
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의 행을 사용하므로 전체 논리 출력을 형성할 필요가 없습니다. 하위 쿼리의.) 그러나 동시에 우리는 계획 시간; 여기에는 두 개를 대체하는 5방향 조인 문제가 있습니다. 별도의 3방향 조인 문제. 기하급수적인 성장으로 인해 가능성의 수에 따라 이는 큰 차이를 만듭니다. 는 플래너는 대규모 조인 검색 문제에 갇히지 않도록 노력합니다. 그 이상인 경우 하위 쿼리를 축소하지 않음from_collapse_limit 발신항목은 상위 쿼리로 이어집니다. 계획을 절충할 수 있습니다 이 런타임 매개변수를 조정하여 계획 품질 대비 시간 단축 위든 아래든.
from_collapse_limit그리고join_collapse_limit거의 동일한 작업을 수행하기 때문에 유사한 이름이 지정됩니다. 기획자가 언제 할 것인지 제어합니다."평평하게 하다 밖으로"하위 쿼리 및 기타 평탄화 시기 제어 명시적 조인을 해제합니다. 일반적으로 다음 중 하나를 설정합니다.join_collapse_limit같음from_collapse_limit(그래서 명시적 조인 및 하위 쿼리도 비슷하게 작동함) 또는 setjoin_collapse_limitto 1(제어하려는 경우 명시적 조인을 사용한 조인 순서). 하지만 다르게 설정할 수도 있습니다. 계획 시간 간의 균형을 미세 조정하려는 경우 그리고 실행 시간.
| 이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | PostgreSQL : 문서 : 9.3 : 범퍼카 토토베이스를 채우는 |
| 통계는 다음에서 사용됩니다. 플래너 | 위로 | 채우는 중 데이터베이스 |