DB/PostgreSQL

[PostgreSQL - DBA] pg_hint_plan 설치하기 (pg_Hint 3/3)

Kang_hobin 2023. 11. 6. 14:28

pg_hint_plan 1탄 .. : 2023.10.13 - [DB/PostgreSQL] - [PostgreSQL - DA] PostgreSQL Hint 사용하기 (pg_Hint 1/3)

 

[PostgreSQL - DA] PostgreSQL Hint 사용하기 (pg_Hint 1/3)

오늘은 PostgreSQL에서 힌트를 사용하는 것을 연습해보려 한다. 일단 PostgreSQL은 Hint를 사용하려면 pg_hint_plan을 Extension 해야한다. 이게 무슨말이냐.. 하면.. PostgreSQL은 외부 lib를 추가하듯이 pg_hint_plan

holog.tistory.com

 

pg_hint_plan 2탄 .. : 2023.10.25 - [DB/PostgreSQL] - [PostgreSQL - DBA] wsl에 PostgreSQL 설치하기(pg_dumpall로 백업하기) (pg_Hint 2/3)

 

[PostgreSQL - DBA] wsl에 PostgreSQL 설치하기(pg_dumpall로 백업하기) (pg_Hint 2/3)

부제 : PostgreSQL Hint 사용하기 - 2 https://holog.tistory.com/80 [PostgreSQL - DA] PostgreSQL Hint 사용하기 오늘은 PostgreSQL에서 힌트를 사용하는 것을 연습해보려 한다. 일단 PostgreSQL은 Hint를 사용하려면 pg_hint_plan

holog.tistory.com


 

일단... pg_hint_plan 최신 버전을 설치하려 공홈에 들어갔다.

 

뭐라뭐라 하는데release는 여기로 오세요 라는 글을 클릭하니 아래로 가졌다.

 


첫번째 삽질..

더보기

클릭하라는 아래 링크로 들어가서 rpm 파일을 다운받았다.. rpm 밖에 없네..

 

https://github.com/ossc-db/pg_hint_plan/releases

 

Releases · ossc-db/pg_hint_plan

Give PostgreSQL ability to manually force some decisions in execution plans. - ossc-db/pg_hint_plan

github.com


ubuntu에서 rpm 파일을 설치하려면 alien 패키지를 이용해서 

Ubuntu에서 사용하는 Deb로 변경시켜야 한다.

먼저 alien 패키지를 설치하자. 

 

# 최신 버전 update
sudo apt-get update

# alien 패키지를 설치
sudo apt-get install alien
1. sudo apt-get update
2. sudo apt-get install alien

 

이제 alien 패키지를 이용해 rpm 파일을 Ubuntu에서 사용하는 deb로 변환시키자.

#RPM파일을 Deb파일로 변환
sudo alien -c {RPM파일명}

#Deb파일 설치
sudo dpkg -i {Deb로변환된파일명}

 

sudo alien -c pg_hint_plan16-1.6.0-1.el9.x86_64.rpm
pg-hint-plan16_1.6.0-2_amd64.deb 파일 생성!
sudo dpkg -i pg-hint-plan16_1.6.0-2_amd64.deb

 

이제 postgresql.conf에 아래 문구를 추가해 준 후에 재기동을 해야한다.

shared_preload_libraries='pg_hint_plan'

 

postgresql.conf 파일 위치는 아래와 같다.

/etc/postgresql/16/main

vi postgresl.conf로 편집기를 연 후에 해당 위치를 찾아서 바꿔주자.

vi 에서 /{검색어} 를 입력하면 찾기가 된다!
바꾸면 리스타트 해야한다고 친절히 써있다. :wq로 저장하고 나오자.

..하려는데 아나 파일이 readonly 였다. 확인해보니 rw r r이네.. postgres로 유저 바꾸고 수정해주자.

rw r r....
사용자를 postgres로 변경

이제 다시 바꿔주자.

:wq 로 저장 완료~

이제 postgresql을 재기동 해주자.

 

# postgresql service 상태 확인해주고
systemctl status postgresql.service

# 죽인 후에
systemctl stop postgresql.service

# 다시 기동
systemctl start postgresql.service

# 다시 상태 확인
systemctl status postgresql.service

 

이제 postgresql 에 접속해서 드디어!!!! create extension 하러 가보자..,.,!

 

.

.

.

아씨 postgresql이 기동이 안된다.. 열받네..

로그 찾으러 가보자..

로그 내용..

아니 뭐야 나 설치했는데 왜 폴더가 없대..?

 

설치한 놈이 어디에 있는지 찾아보자..

dpkg -L pg-hint-plan16

음? /usr/pgasql-16 폴더 아래에 있네..?  아까 위에서 보면 /usr/share/... 여기서 못찾고있던데..

저기에다가 옮겨줘 보자

다 옮겨진거같은데..

 

이제 다시 아까 postgresql.conf 파일을 수정하고 재기동 해보자... 제발..!

하...씨!!!!!!!!!!!!!! 안된다!!



첫번째 삽질에서  postgresl.conf 수정하는 것은 꼭 해야하는 일이니 위에서 보고 오도록..

shared_preload_libraries='pg_hint_plan'

휴......... 두번째 도전...

 

이번엔 tar.gz 파일을 받아서.. make install 해본다...

 

일단 받았고.......... 공홈 사이트 보니까 뭐 요래요래 하란다... 해보자..

 

https://pg-hint-plan.readthedocs.io/en/latest/installation.html#building-binary-module

 

Installation — pg_hint_plan documentation

© Copyright 2012-2023, NIPPON TELEGRAPH AND TELEPHONE CORPORATION. Revision fa0a461a.

pg-hint-plan.readthedocs.io

이게 요래요래 하라는 것의 요래요래 되겠다
압축 해제 해주고

 

하려는데 make가 없네? 먼저 받아주자..

 

 

이제 make를 해볼까.................

 

하.. 씨..>빨!

아니 이건 또 뭔오륜데?

root@AISELN-kanghb:/home/hobin/pg_hint/pg_hint_plan-REL16_1_6_0# make install
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -fPIC -fvisibility=hidden -I. -I./ -I/usr/include/postgresql/16/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o pg_hint_plan.o pg_hint_plan.c
pg_hint_plan.c:12:10: fatal error: postgres.h: No such file or directory
   12 | #include "postgres.h"
      |          ^~~~~~~~~~~~
compilation terminated.
make: *** [<builtin>: pg_hint_plan.o] Error 1

 

검색 해보니 바로 나오는 stack over flow 답변... 감사합니다...

https://stackoverflow.com/questions/56724622/how-to-fix-postgres-h-file-not-found-problem

 

How to fix 'postgres.h' file not found problem?

I am trying to write a base type for PostgreSQL in C (using xcode), and I already installed PostgreSQL 11, but it seems that postgres.h cannot be simply included in the file ("'postgres.h' file not...

stackoverflow.com

 

요약 : 다음 명령을 사용하여 postgresql-server-dev 패키지를 설치하렴.

sudo apt install postgresql-server-dev-16

이젠 make가 되는군 감사합니다..

그럼 make install 날려주고..

오 /usr/share/postgresl/16/extension에 뭔가 막 해주네 그렇지 이제 될거같다!!!!

 

오오ㅓ오ㅓ오ㅗ오 되는 거 같다 이제 postgresql 서버를 재기동 다시 해주면..?

tail -f postgresql-16-main.log 내용. 켜졌다!!!!!!!!!!!!

하 드디어 설치된 거 같다................ extension 확인해보러 psql 접속 해보자!!!

 

가용한 extensions 목록 보기 쿼리
영롱한... pg_hint_plan

 

하..... 됬따...

 

아까 공식문서에서 pg_hint_plan does not require CREATE EXTENSION.. 라는 문구로 보니.. 뭐 create 안해도 된다니까 한번 안하고 현재 Session 에서만 Load 해서 써보자.

 

 

테스트 쿼리 준비하고

 

힌트를 안썼을 땐 b 테이블이 index Scan 대상으로 나오니 한번 b 테이블을 SeqScan 하라고 강제해보자.

 

오오오오오오 내 말을 잘 듣는다 seqscan으로 변경됬다..................!

하 드디어...성공... hint........ 

 

create extension 까지만 해놓고 끝내야지..

 

create 하니까 pg_extension 리스트에 나오는군~ 성공~

 

 

hint에 대한 더 다양한 활동은 추후 이어서 쓰겠다..

오늘은 여기까지..