写点什么

【我和 openGauss 的故事】openGauss 价值特性(一)

作者:daydayup
  • 2023-07-28
    北京
  • 本文字数:1706 字

    阅读完需:约 6 分钟

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


注意事项


  • 不支持 Agg、Sort、Setop 和 Subplan 的 hint。

  • 仅指定 join 顺序,不指定内外表顺序。

  • 语法: leading(t1 t2 t3)

  • 仅指定 join 顺序,指定内外表顺序。

  • 语法: leading((t1 t2 t3))


实践操作


1、预置数据如下:


 table: employee 职员表--==============================================================CREATE TABLE employee(empid int not null, --职员工号empname text not null, --职员姓名deptid int not null, --部门IDsalary int not null, --工资constraint pk_employee primary key (empid));
--==============================================================-- table: department 部门表--==============================================================CREATE TABLE department(deptid int not null, ---部门IDdeptname text not null, ---部门名称parentid int not null, --上级部门IDconstraint 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 msopenGauss=# 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
复制代码


结论


通过上述实践,在连接时,如果关联列没有索引,那么选择行数比较少的表做内表,可以提升查询效率;如果关联列有索引,选择建了索引的表做内表,可以提升查询效率。

用户头像

daydayup

关注

还未添加个人签名 2023-07-18 加入

还未添加个人简介

评论

发布
暂无评论
【我和openGauss的故事】openGauss价值特性(一)_daydayup_InfoQ写作社区