안녕하세요.
PostgreSQL의 Hashjoin과정에 대해 궁금하여 공부하고 있는 학생입니다.
혹시 work_mem을 변경하는 방법 말고는, bucket수를 늘리고 싶은 방법은 없을까요?
혹은, 한 버켓에 할당하는 메모리크기를 바꾸는 방법은 없을까요?
감사합니다.
hash join 은 해시맵을 만들 메모리가 넉넉한가를 보고 만듭니다.
물론
http://postgresql.kr/docs/current/runtime-config-query.html#RUNTIME-CONFIG-QUERY-CONSTANTS
페이지에서 다루고 있는 각 환경 변수값들을 이용해서,
추정할 뿐입니다.
실행 계획을 이 값들을 조정해서 바꿀 수는 있겠지만,
hash join을 위한 메모리를 더 많이 할당해서, nested loop 사용을 피하겠다는 방식은 불가능합니다.
그저 최적화기가 hash join을 선택했다면, 세션이 자기가 쓸 수 있을 만큼 메모리를 쓰다가 모자라면,
임시 해시 테이블로 디스크에 쓰고, 그것을 참조합니다.
세션이 그 hash 메모리를 위한 버켓도 PostgreSQL에서 사용하는 기본 페이지 8k바이트 단위로 움직일겁니다. 구체적으로 안봐서 모름.
이 부분은 아마도 컴파일 시 지정하는 블럭 크기를 바꾸면 같이 바뀌지 않을까합니다.