openGauss 是一款高性能、易运维的开源关系型数据库。openGauss 提供了众多的价值特性,可以极大地帮助数据库开发和运维工程师方便地进行数据库管理和维护。本文将对 openGauss 所提供的 plan hint、索引推荐、闪回恢复做一个简单的介绍**。**
Plan Hint 调优
Plan Hint 为用户提供了直接影响执行计划生成的手段,用户可以通过指定 join 顺序、join、scan 方法、指定结果行数等多个手段来进行执行计划的调优,以提升查询的性能。
支持范围
当前版本 Plan Hint 支持的范围如下,后续版本会进行增强。
指定 Join 顺序的 Hint - leading hint
指定 Join 方式的 Hint,仅支持除 semi/anti join、unique plan 之外的常用 hint。
指定结果集行数的 Hint
指定 Scan 方式的 Hint,仅支持常用的 tablescan、indexscan 和 indexonlyscan 的 hint。
指定子链接块名的 Hint
注意事项
实践操作
1、预置数据如下:
table: employee 职员表
--==============================================================
CREATE TABLE employee(
empid int not null, --职员工号
empname text not null, --职员姓名
deptid int not null, --部门ID
salary int not null, --工资
constraint pk_employee primary key (empid)
);
--==============================================================
-- table: department 部门表
--==============================================================
CREATE TABLE department(
deptid int not null, ---部门ID
deptname text not null, ---部门名称
parentid int not null, --上级部门ID
constraint pk_department primary key (deptid)
);
复制代码
2、测试:语法: leading((t1 t2 ))
openGauss=# explain select /*+ leading((department employee)) */ * from department join employee on employee.deptid = department.deptid;
QUERY PLAN
-------------------------------------------------------------------------------
Hash Join (cost=69853.65..113081.05 rows=1462340 width=33)
Hash Cond: (department.deptid = employee.deptid)
-> Seq Scan on department (cost=0.00..164.00 rows=10000 width=17)
-> Hash (cost=30153.40..30153.40 rows=1462340 width=16)
-> Seq Scan on employee (cost=0.00..30153.40 rows=1462340 width=16)
(5 rows)
Time: 1.059 ms
openGauss=# explain select /*+ leading((employee department)) */ * from department join employee on employee.deptid = department.deptid;
QUERY PLAN
-----------------------------------------------------------------------------
Hash Join (cost=289.00..50549.58 rows=1462340 width=33)
Hash Cond: (employee.deptid = department.deptid)
-> Seq Scan on employee (cost=0.00..30153.40 rows=1462340 width=16)
-> Hash (cost=164.00..164.00 rows=10000 width=17)
-> Seq Scan on department (cost=0.00..164.00 rows=10000 width=17)
(5 rows)
Time: 0.856 ms
复制代码
3、结果:改变内外表顺序,对 SQL 的执行还是由影响的
openGauss=# CREATE INDEX idx_empdepid on employee (deptid);
openGauss=# explain select /*+ leading((department employee)) */ * from department join employee on employee.deptid = department.deptid;
QUERY PLAN
-------------------------------------------------------------------------------
Hash Join (cost=38030.00..52806.50 rows=1000000 width=33)
Hash Cond: (department.deptid = employee.deptid)
-> Seq Scan on department (cost=0.00..164.00 rows=10000 width=17)
-> Hash (cost=25530.00..25530.00 rows=1000000 width=16)
-> Seq Scan on employee (cost=0.00..25530.00 rows=1000000 width=16)
(5 rows)
Time: 0.833 ms
复制代码
结论
通过上述实践,在连接时,如果关联列没有索引,那么选择行数比较少的表做内表,可以提升查询效率;如果关联列有索引,选择建了索引的表做内表,可以提升查询效率。
评论