배트맨 토토/Optimizer최적의 실행 계획을 작성하십시오. 먼저 가능한 모든 것을 결합합니다 의 방법스캔및가입쿼리에 나타나는 관계. 모두 생성 된 경로는 동일한 결과로 이어지고 각 경로 실행 비용을 추정하고 알아 내기위한 최적화 어느 것이 가장 저렴한 지.
배트맨 토토/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)는 그렇지 않습니다 현재 노드의 튜플을 고려해야하지만 튜플 다음 "더 깊은"노드 (즉, 하위 계획의 상단 노드) 대신 사용해야합니다.
모든SortandSeqscannode 그림 \ ref 배트맨 토토에 나타납니다 에이TargetList그러나 없었기 때문입니다 충분한 공간 만mergejoin노드를 그릴 수 있습니다.
배트맨 토토/Optimizer가 수행 한 다른 작업이를 수정하고 있습니다.운영자 IDSinexprandOper노드. 처럼 앞에서 언급 한Postgres다양한 데이터 유형을 지원하고 사용자 정의도 지원합니다. 유형을 사용할 수 있습니다. 엄청난 양을 유지할 수 있습니다 기능 및 운영자 시스템에 저장해야합니다. 테이블. 각 기능과 연산자는 고유 한 연산자 ID를 얻습니다. 내에서 사용 된 속성의 유형에 따라 자격 등, 적절한 운영자 ID는 있어야합니다 사용된.