59.3. PostgreSQL 유전 쿼리 최적화 Genetic Query Optimization (GEQO)

59.3.1. GEQO로 가능한 계획 짜기
59.3.2. PostgreSQL GEQO 개선 할 점

GEQO 모듈은 잘 알려진 방문 판매원 문제(traveling salesman problem, TSP)를 쿼리 최적화 관점에서 풀어보려고 만들었다. 가능한 쿼리 실행 계획은 숫자로된 문자열로 인코딩된다. 각 문자열은 하나의 릴레이션과 다른 릴레이션을 조인 하는 순서로 구성된다. 예를 들어 조인 구조가 다음과 같다면:

   /\
  /\ 2
 /\ 3
4  1

이것은 '4-1-3-2' 문자열로 인코딩 된 것이며, '4'와 '1'을 처음 조인하고, 다음 '3', 마지막에 '2'를 조인한다. 1, 2, 3, 4 는 PostgreSQL 최적화기가 사용하는 릴레이션 ID들이다.

PostgreSQL에서 구현된 GEQO 기능은 다음 특성이 있다:

GEQO 모듈의 부분은 D. Whitley의 유전자 알고리즘에서 가져왔다.

GEQO 모듈은 PostgreSQL 쿼리 최적화기가 많은 조인을 사용하는 쿼리의 실행 계획을 짤 때 모든 경우의 수를 조사하지 않고 차선의 실행 계획을 빨리 선택할 수 있도록 지원한다.

59.3.1. GEQO로 가능한 계획 짜기

GEQO 실행 계획 처리에서 개별 릴레이션의 탐색을 위한 실행 계획를 짜기위해서 표준 실행 계획 코드를 사용한다. 다음, 조인 계획은 유전자 조작 기법을 이용해서 찾는다. 앞에서 설명한 것과 같이, 각 후보군 조인 계획은 기본 릴레이션과 그 연결 순서로 나열된다. 처음에는 GEQO를 통해 가능한 범위 안에서 단순 무작위 연결 순서로 계획을 짠다. 조인 순서를 고려하는 작업은, 먼저 표준 실행 계획기 코드를 통해 만든 단순 실행 계획의 비용을 추정한다. (각각의 조인 계획은 가능한 세가지 조인 전략을 모두 고려하고, 초기 결정된 릴레이션 검색 계획에 모두 반영한다. 이 가운데, 선택되는 실행 계획은 그 추정 비용이 제일 싼 것이다.) 추정 비용이 싸다는 것은 비싼 계획보다 보다 적합한 계획으로 간주한다. 유전 알고리즘은 제일 나쁜 후보 계획을 버린다. 다음, 보다 접합한 새로운 실행 계획 후보를 만든다. (마치, 유전자 조작으로 새로운 염색체를 만들 듯) — 이렇게 무작위 선택과 비용이 제일 비싼 것을 버리는 방식으로 미리 정의된 회수만큼 반복한다. 이렇게 해서 최선의 쿼리 실행 계획은 아니지만, 일정 시간 안에서 찾을 수 있는 최선의 실행 계획을 선택한다.

이 과정은 본질적으로 비결정론적이다. 왜냐하면, 처음 만드는 실행 계획과 다은 변의 작업으로 만들어내는 보다 나은 실행 계획 사이 선택은 무작위 선택을 이용하기 때문이다. 선택된 실행 계획의 엉뚱한 변화를 막기 위해서, geqo_seed 환경 설정값으로 GEQO 알고리즘은 매번 난수 발생기를 매번 재실행한다. 이렇게 해서, 동일 입력값 (테이블 통계정보, 쿼리 내용) 환경에서는 geqo_seed와 그 관련 환경 설정값들이 바뀌지 않으면, 실행 계획도 바뀌지 않는다. GEQO 알고리즘으로 만들어내는 다른 실행 계획을 보고싶다면, geqo_seed 환경설정값을 변경하면 된다.

59.3.2. PostgreSQL GEQO 개선 할 점

유전 알고리즘 매개 변수 설정에 관련하여 여전히 작업이 필요하다. src/backend/optimizer/geqo/geqo_main.c 파일 안, gimme_pool_size, gimme_number_generations 함수 부분이며, 작업은 다음 두가지 서로 상충한 부분을 어떻게 적절하게 타협하여 최적화하는가이다.

  • 최고의 실행 계획

  • 그것을 찾기 위한 처리 시간

현재까지 구현된 것의 한계점은, 일단 표준 실행계획기에서 각 릴레이션 탐색 비용과, 그 릴레이션과 조인 비용을 먼저 계산해서 그 값을 가지고, 적합성을 판단한다. 또한 비슷한 쿼리 패턴을 띈 하위 쿼리들에 대해서도 같은 알고리즘을 적용해 최적 계획을 찾기 위한 반복작업을 한다. 이런 부분을 좀더 개선하면, 하위 조인 작업들이 있는 쿼리들에 대한 쿼리 최적화 작업은 보다 빨라질 것이다. 물론 메모리 사용에 있어서도 효율성이 좋아질 것이다.

좀 더 원론적인 이야기로, TSP 해결책으로 제시된 유전 알고리즘을 쿼리 최적화에 쓰겠다는 것이 좋은 방법인지는 아직 명확하지 않다. TSP에서는 각 하위 문자열 (개별 여행)과 관계된 비용이 그 전체 여행 계획과 독립적인 비용이지만, 쿼리 최적화 관점에서는 각각의 실행 계획 비용이 전체 비용에 영향을 미친다. 따라서 가장자리 edge 재조합 교차 변의가 과연 효과적인 의문이 남아있다.