이터레이터, 관계형 연산, 그리고 조인

-
쿼리는 내부적으로 관계형 연산으로 변하게 되며 이것은 논리적 쿼리 실행 계획으로 나타나고, 옵티마이저에 의해서 물리적 쿼리 실행 계획으로 변해서 쿼리가 실제로 실행되게 된다.
-
옵티마이저가 쿼리 실행자를 선택해서 실제 쿼리를 실행하게 된다. 쿼리 실행자는 이터레이터 인터페이스를 구현하여 실제 인스턴스로 존재한다.

-
이터레이터 인터페이스는 위와 같이 구성된다.
setup()메서드는 데이터 그래프를 그릴때 사용되며, 자식 그래프 노드를 포함해서 그린다. -
init()은 이터레이터를 실행하기 위해서 필요한 것을 생성하는 단계다.next()는 이터레이터로부터 하나의 튜플을 반환한다.close()는 이터레이터를 종료하는데 사용된다. -
이터레이터는 캡슐화 되어 있어서 실제 구현이 무엇인지 상관없이 동작할 수 있다.
-
이터레이터는 내부적으로 상태를 가지고 유지할 수 도 있다. 예를 들어서, 해시 테이블이나, 실행중인 양, 그리고 큰 정렬된 파일과 같은
SELECT 쿼리

- 처음에 초기화를 하여, 자식 그래프를 불러온 다음에,
next()를 통해서 모두 순회함을 알 수 있다.
힙 스캔

-
우선 초기화 단계에서 첫 번째 페이지로부터 첫 번째 슬롯을 읽는다. 그리고 순회하는 단계에서, 현재 페이지가 NULL 이면 바로 종료하고 NULL이 아니라면 현재 슬롯을 페이지의 다음으로 얻어온다.
-
현재 슬롯이 NULL 이면 다음 페이지로 넘어가고 다음 페이지가 NULL이 아니라면 슬롯을 현재 페이지의 첫 번째 슬롯으로 변경한다.
-
그리고 마지막으로 힙 스캔과 관련된 할당된 자원들을 반환한다.
-
힙 스캔은 자식들이 없기 때문에 초기화 하거나, 다음을 찾는 연산을 재귀적으로 하지 않는다.
정렬 (2 패스)

-
init()으로 자식들을 모두init()한다. 그리고 반복적으로child.next()를 순회하여 디스크에서 정렬을 시도한다. -
정렬된 파일이 버퍼에 로드된다. 이것이 1 패쓰이다. 그리고 나서, 버퍼들 중에 가장 적은 튜플을 선택해서 병합한다.
정렬된 값이 들어올 때 그룹바이 연산
