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 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) |
Cảm ơn bạn đã đọc tôi!!!