Thứ Năm, 27 tháng 7, 2023

Giới thiệu về pg_hint_plan để quản lý SQL trong PostgreSQL

1. Pg_hint_plan là gì?

Pg_hint_plan là một công cụ dùng để quản lý , điều khiển các kế hoạch thực thi câu lệnh SQL bằng cách sử dụng định dạng '/*+' và '*/' này đặt trước câu lệnh SQL. Nhờ đó mà ta có thể quyết định câu lệnh SQL được thực thi với kế hoạch tối ưu nhằm cải thiện tốc độ xử lý của SQL.

2. Qúa trình thực hiện một câu lệnh SQL:

3. Cài đặt pg_hint_plan:

Các version pg_hint_plan bạn có thể tải tại đây https://github.com/ossc-db/pg_hint_plan/releases

tar xfz pg_hint_plan-REL12_1_3_7.tar.gz
 cd pg_hint_plan-REL12_1_3_7
make
make install

 
Cấu hình pg_hint_plan vào file config postgresql
$ vi $PGDATA/postgresql.conf
shared_preload_libraries = 'pg_hint_plan'
Ngoài ra bạn có thêm các thuộc tính sau vào file config postgresql:
pg_hint_plan.enable_hint = on : bật hay tắt pg_hint_plan
pg_hint_plan.enable_hint_table = on : bật hay tắt pg_hint_pl``an cho bảng
pg_hint_plan.debug_print = on : bật hay tắt chế độ debug
`pg_hint_plan.message_level = log` bật hay tắt chế độ lưu log
 
`pg_ctl restart -D $PGDATA`
`test2=# create extension pg_hint_plan;`
`CREATE EXTENSION`

4. Testing và sử dụng pg_hint_plan

create table t1 (c1 int, c2 int, c3 int, dummy char(100));
create index t1_idx1 on t1 (c1, c2, c3);
create index t1_idx2 on t1 (c2, c3);
create index t1_idx3 on t1 (c3);
create index t1_idx4 on t1 (c1);

create table t2 (c1 int, c2 int, c3 int, dummy char(100));
create index t2_idx1 on t2 (c1, c2, c3);
create index t2_idx2 on t2 (c2, c3);
create index t2_idx3 on t2 (c3);

create table t3 (c1 int, c2 int, c3 int, dummy char(100));
create index t3_idx1 on t3 (c1, c2, c3);
create index t3_idx2 on t3 (c2, c3);
create index t3_idx3 on t3 (c3);
 
insert into t1 select 1, mod(c1,100), mod(c1,1000), 'dummy' from generate_series(1,100000) c1;
insert into t2 select 1, mod(c1,100), mod(c1,1000), 'dummy' from generate_series(1,10000) c1;
insert into t3 select 1, mod(c1,100), mod(c1,1000), 'dummy' from generate_series(1,100) c1;

/*+ IndexScan(t1 t1_idx1) */ explain analyze select * from t1 where c1=1 and c2=10 and c3=100

 
/*+ IndexScan(t1 t1_idx4) */ explain analyze select * from t1 where c1=1 and c2=10 and c3=100

 
/*+ Leading(c b a) NestLoop(c b) HashJoin(c b a) */ explain analyze select a.*, b.*, c.* from t1 a, t2 b, t3 c where a.c1=b.c1 and a.c2=b.c2 and a.c3=b.c3 and b.c1=c.c1 and b.c2=c.c2 and b.c3=c.c3

 
/*+ Leading(a b c) HashJoin(a b) NestLoop(a b c) */ explain analyze select a.*, b.*, c.* from t1 a, t2 b, t3 c where a.c1=b.c1 and a.c2=b.c2 and a.c3=b.c3 and b.c1=c.c1 and b.c2=c.c2 and b.c3=c.c3

 
INSERT INTO hint_plan.hints(norm_query_string, application_name, hints) VALUES ( 'explain analyze select * from t1 t where c1=?;', '', 'SeqScan(t)' );
select * from hint_plan.hints;
explain analyze select * from t1 t where c1=10;

Hoặc có thể đặt pg_hint_plan vào trong câu lệnh SQL

5. Tìm hiểu thêm về các phương pháp truy xuất dự liệu

Phương pháp scanGiải thích
SeqScan(table)Truy xuất theo thứ tự trên bảng
TidScan(table)Truy xuất TID(Tuple ID0 trên bảng
IndexScan(table[ index...])Truy xuất dựa theo index
IndexOnlyScan(table[ index...])Chỉ truy xuất dựa theo index mà không truy cập table
BitmapScan(table[ index...])Chỉ truy xuất dựa theo Bitmap
IndexScanRegexp(table[ POSIX Regexp...])Truy xuất chỉ mục dựa theo các mẫu Regrex
IndexOnlyScanRegexp(table[ POSIX Regexp...])Truy xuất chỉ mục dựa theo các mẫu Regrex mà không truy cập bảng
BitmapScanRegexp(table[ POSIX Regexp...])Truy xuất Bitmap dựa theo các mẫu Regrex chỉ định
NoSeqScan(table)Truy xuất không theo thứ tự
NoTidScan(table)Truy xuất không theo TID
NoIndexScan(table)Truy xuất không theo chỉ mục
NoIndexOnlyScan(table)Truy xuất không theo chỉ mục mà không cần truy cập
NoBitmapScan(table)Truy xuất không theo Bitmap

 

Phương pháp joinGiải thích
NestLoop(table table[ table...])Vòng lặp lồng nhau bắt buộc cho các liên kết bao gồm các bảng được chỉ định.
HashJoin(table table[ table...])Tạo kết nối dựa theo bảng băm của các bảng được chỉ định.
MergeJoin(table table[ table...])Hợp nhất các liên kết của các bảng chỉ định
NoNestLoop(table table[ table...])Ngược lại với Nestloop
NoHashJoin(table table[ table...])Ngược lại với Hashjoin
NoMergeJoin(table table[ table...])Ngược lại với MergeJoin

 

Phương pháp khácGiải thích
Leading(table table[ table...])Tạo liên kết theo tự các bảng chỉ định
Leading()Tạo liên kết theo thứ tự và hướng mặc định
Rows(table table[ table...] correction)Sửa số hàng của liên kết bao gồm các bảng đã xác định
Parallel(table [soft|hard])Sử dụng hay ngăn chặn việc xử lý nhiều luồng song song
Set(GUC-param value)Thiết lập các giá trị GUC trong lúc thực hiện kế hoạch (planner)

Hy vọng hữu ích cho bạn.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master