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_planpg_hint_plan.enable_hint_table = on
: bật hay tắt pg_hint_pl``an cho bảngpg_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 scan | Giả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 join | Giả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ác | Giả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