배트맨 토토/Optimizer최적의 실행 계획을 작성하십시오. 먼저 가능한 모든 것을 결합합니다 의 방법스캔and가입쿼리에 나타나는 관계. 모두 생성 된 경로는 동일한 결과로 이어지고 각 경로 실행 비용을 추정하고 알아 내기위한 최적화 어느 것이 가장 저렴한 지.
배트맨 토토/Optimizer는 어떤 계획을 생성 해야하는지 결정합니다 나타나는 관계에 정의 된 지수의 유형에 따라 쿼리에서. 항상 수행 할 가능성이 있습니다 관계에 대한 순차적 스캔이므로 순차적으로 만 사용하는 계획 스캔은 항상 생성됩니다. 인덱스가 관계에 정의되어 있다고 가정합니다 (예 : B-Tree Index) 및 쿼리에는 제한이 포함되어 있습니다relation.attribute opr 상수. 만약에relation.attribute와 일치합니다 B-Tree 지수의 키 및opris '<'이외의 다른 계획은 B- 트리를 사용하여 만들어집니다. 관계를 스캔하는 색인. 추가 지수가있는 경우 쿼리의 제한은 인덱스 키와 일치합니다. 추가 계획이 고려됩니다.
싱글 스캔을위한 실현 가능한 계획이 발견되었습니다. 관계, 관계 가입 계획이 만들어집니다. 그만큼 배트맨 토토/Optimizer는 두 관계 간에만 결합 된 것을 고려합니다 해당 조인 절 (즉, 와 같은 제한여기서 rel1.attr1 = rel2.attr2존재). 모두 가능한 계획이 플래너/최적화기. 가능한 세 가지 조인 전략은 다음과 같습니다.
중첩 반복 조인: 오른쪽 왼쪽에있는 튜플마다 관계가 한 번 스캔됩니다. 관계. 이 전략은 구현하기 쉽지만 매우 시간이 많이 걸리기.
통합 정렬 조인: 각 관계는입니다 조인이 시작되기 전에 조인 속성을 정렬합니다. 그럼 두 가지 관계가 함께 합병되어 둘 다 관계는 조인 속성에 대해 주문됩니다. 이런 종류의 가입 모든 관계를 스캔해야하기 때문에 더 매력적입니다. 한 번만.
해시 조인: 올바른 관계는입니다 결합 속성을 먼저 해시했습니다. 다음으로 좌익은입니다 스캔하고 발견 된 모든 튜플의 적절한 값은 오른쪽에 튜플을 찾기 위해 해시 키로 사용 관계.
여기서 우리는 표시되는 노드에 대한 약간의 설명을 제공합니다. 계획. 그림 \ ref 배트맨 토토은 쿼리를 위해 생성 된 계획을 보여줍니다 예제 \ ref simple_select.
계획의 상단 노드는 A입니다.mergejoin두 명의 후계자가있는 노드, 하나는 필드에 첨부LeftTree그리고 두 번째는 필드에 첨부RightTree. 각 서브 노드는 각각을 나타낸다 가입의 한 가지 관계. 위에서 언급했듯이 병합 정렬 조인 각 관계를 정렬해야합니다. 그게 우리가 찾는 이유입니다Sort각 하위 계획의 노드. 추가 쿼리에 제공된 자격 (s.sno 2)는 가능한 한 멀리 밀려 나고에 첨부됩니다.qpqual잎의 필드Seqscan해당 하위 플랜의 노드
필드에 첨부 된 목록Mergeclauses의Mergejoin노드에는 조인에 대한 정보가 포함되어 있습니다 속성. 값65000and65001용varno필드var노드에 표시Mergeclauses목록 (그리고 또한TargetList)는 그렇지 않습니다 현재 노드의 튜플을 고려해야하지만 튜플 다음 "더 깊은"노드 (즉, 하위 계획의 상단 노드) 대신 사용해야합니다.
모든SortandSeqscan그림 \ ref 배트맨 토토에 나타나는 노드가 있습니다 에이TargetList그러나 없었기 때문입니다 충분한 공간 만mergejoin노드를 그릴 수 있습니다.
배트맨 토토/Optimizer가 수행 한 다른 작업이를 수정하고 있습니다.운영자 IDSinexprandOper노드. 처럼 앞에서 언급 한Postgres다양한 다양한 데이터 유형을 지원하고 사용자 정의도 지원합니다. 유형을 사용할 수 있습니다. 엄청난 양을 유지할 수 있습니다 기능 및 운영자 시스템에 저장해야합니다. 테이블. 각 기능과 연산자는 고유 한 연산자 ID를 얻습니다. 내에서 사용 된 속성의 유형에 따라 자격 등, 적절한 운영자 ID는 있어야합니다 사용된.