Hint是Oracle数据库中很有特色的一个功能,pg和oracle的优化器一样也是CBO(基于成本的)。但是在pg中是没有hint的,但是我们可以去通过设置成本因子,设置优化器开关等方式来"建议"数据库按照我们的想法去生成执行计划,但是并不能强制,例如:

bill=# explain select * from t1;QUERY PLAN
-------------------------------------------------------Seq Scan on t1  (cost=0.00..22.70 rows=1270 width=36)
(1 row)

对于上面这个简单的全部扫描查询,即使我们关闭全表扫描开关也没用:

bill=# set enable_seqscan TO off;
SET
bill=# explain select * from t1; QUERY PLAN
--------------------------------------------------------------------------Seq Scan on t1  (cost=10000000000.00..10000000022.70 rows=1270 width=36)
(1 row)

那么我们能否在pg中使用像oracle的hint的方法呢?答案是可以的,pg提供了一个pg_hint_plan的插件,可以完成类似的功能。

测试:
下载地址:http://iij.dl.sourceforge.jp/pghintplan/

安装:
pg11@oracle-> tar -zxvf pg_hint_plan11-1.3.4.tar.gz
pg11@oracle-> cd pg_hint_plan11-1.3.4
pg11@oracle-> gmake clean
pg11@oracle-> gmake
pg11@oracle-> gmake install
pg11@oracle-> vi $PGDATA/postgresql.conf
–添加以下内容
shared_preload_libraries = ‘pg_hint_plan’
pg_hint_plan.enable_hint = on
pg_hint_plan.debug_print = on
pg_hint_plan.message_level = log

pg11@oracle-> pg_ctl restart -m fast

使用:

pg11@oracle-> psql bill bill
psql (11.1)
Type "help" for help.bill=# create extension pg_hint_plan ;
CREATE EXTENSION

用法举例:

bill=# create table a(id int primary key, info text, crt_time timestamp);
CREATE TABLE
bill=# create table b(id int primary key, info text, crt_time timestamp);
CREATE TABLE
bill=# insert into a select generate_series(1,100000), 'a_'||md5(random()::text), clock_timestamp();
INSERT 0 100000
bill=# insert into b select generate_series(1,100000), 'b_'||md5(random()::text), clock_timestamp();
INSERT 0 100000
bill=# analyze a;
ANALYZE
bill=# analyze b;
ANALYZE
bill=# explain select a.*,b.* from a,b where a.id=b.id and a.id<10; QUERY PLAN
-----------------------------------------------------------------------Nested Loop  (cost=0.58..29.24 rows=9 width=94)->  Index Scan using a_pkey on a  (cost=0.29..3.05 rows=9 width=47)Index Cond: (id < 10)->  Index Scan using b_pkey on b  (cost=0.29..2.91 rows=1 width=47)Index Cond: (id = a.id)
(5 rows)

使用pg_hint_plan来改变执行计划 :

bill=# /*+
bill*#   HashJoin(a b)
bill*#   SeqScan(b)
bill*# */ explain select a.*,b.* from a,b where a.id=b.id and a.id<10;  QUERY PLAN
-----------------------------------------------------------------------------Hash Join  (cost=3.16..2200.67 rows=9 width=94)Hash Cond: (b.id = a.id)->  Seq Scan on b  (cost=0.00..1935.00 rows=100000 width=47)->  Hash  (cost=3.05..3.05 rows=9 width=47)->  Index Scan using a_pkey on a  (cost=0.29..3.05 rows=9 width=47)Index Cond: (id < 10)
(6 rows)

更多使用方法举例:

bill=# /*+ SeqScan(a) */ explain select * from a where id<10;  QUERY PLAN
-----------------------------------------------------Seq Scan on a  (cost=0.00..2185.00 rows=9 width=47)Filter: (id < 10)
(2 rows)bill=# /*+ BitmapScan(a) */ explain select * from a where id<10;QUERY PLAN
---------------------------------------------------------------------Bitmap Heap Scan on a  (cost=1.66..13.21 rows=9 width=47)Recheck Cond: (id < 10)->  Bitmap Index Scan on a_pkey  (cost=0.00..1.66 rows=9 width=0)Index Cond: (id < 10)
(4 rows)

目前pg_hint_plan支持的hint类型:
http://pghintplan.sourceforge.jp/hint_list.html

PostgreSQL hint用法(兼容oracle)相关推荐

  1. oracle listagg支持,PostgreSQL行列转换(兼容oracle listagg)

    oracle11g开始支持的listagg函数替代了wmconcat来实现行列转换的功能. listagg函数的用法: oracle行列转换例子: -建表https://www.cndba.cn/fo ...

  2. PostgreSQL隐藏列(兼容oracle)

    oracle 12cR1新增了隐藏列的功能,在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件,现在我们可以通过隐藏列来实现这一功能. ...

  3. postgres oracle 兼容,PostgreSQL嵌套表(兼容oracle)

    oracle中的嵌套表是某些行的集合,它在主表中表示为其中的一列.对主表中的每一条记录,嵌套表可以包含多个行. 通俗地说,嵌套表就是表中的表,把一个表中的字段定义为一个表,这个字段表的数据存储在外部的 ...

  4. PostgreSQL实现USERENV函数(兼容oracle)

    oracle中使用USERENV 函数来获取当前会话变量的函数,支持的参数有: CLINET_INFO 返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_IN ...

  5. Oracle的hint的作用,Oracle Hint 用法

    正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+    */ 和注释很像,比注释多了一个"+ ...

  6. Oracle调优之Hint用法整理笔记

    整理工作中用到的Hint,不定时更新,Hint是oracle早期因为oracle优化器还不是很完善加上去的,可以辅助oracle优化器,Hint 是Oracle 提供的一种SQL语法,常用于SQL调优 ...

  7. oracle中orand使用,Postgres兼容Oracle研究——orafce调研

    一.背景 PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面.甚至大多数的日常应用的性能也不会输给Oracle. 但是Oracle有些函数或者包,默认Po ...

  8. oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?

    作者介绍 洪烨,openGauss Contributor,多年银行业系统架构设计及DBA实战经验,<DB2数据库内部解析与性能调优>作者. openGauss的前世今生 上一篇看到很多朋 ...

  9. 达梦数据库兼容Oracle之SQL语法(一)

    对于刚从Oracle数据库转到达梦数据库,SQL语法的使用基本一致,有一些差别,下面总结的一些常用SQL语法差别. 文章目录 1.导入数据 2.返回查询数据的返回行 3 外连接用法 4.多列IN用法 ...

最新文章

  1. django学习笔记【003】创建第一个带有model的app
  2. 【组队学习】孙健坤:基于Python的会员数据化运营
  3. CC2540开发板学习笔记(一)——LED点亮
  4. ACS AD 和本地验证SSL ×××
  5. mysql 查看最近的语句_查看MySQL最近执行的语句
  6. OWIN的理解和实践(三) –Middleware开发入门
  7. Struts 学习笔记2(输入校验、国际化、异常处理)
  8. BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
  9. [禅悟人生]心平气和, 慢慢修行
  10. ubuntu c++检测usb口事件变化_拆解报告:美式双USBA口充电插座
  11. Chapter3-2_Speech Separation(TasNet)
  12. Oracle中给表添加主键 外键,给表中添加主键、外键
  13. 官方澄清丨Gartner并未组织评选OpenStack八大厂商
  14. matlab6数学建模基础教程,《数学建模基础教程》.pdf
  15. 【YBT2022寒假Day1 B】方格填写(插头DP)
  16. html p 标签文字换行与不换行以及文字隐藏
  17. 参考文献起止页码怎么写_期刊作为参考文献要求有年卷期和起止页码,怎么查这些页码什么的...
  18. 利用useRef hooks 解决 定时器关闭不到的问题
  19. ubuntu下使用 RabbitVCSRapidSVN
  20. 输入一个字符,判断输入的是控制字符、数字、大小写字母还是其他字符,并给出相应提示

热门文章

  1. Java反射原理和实际用法
  2. EDG 赢了,程序员们坐不住了.....
  3. kill命令详解kill -9、kill -15区别
  4. uchar和char、schar的区别
  5. C语言:srand函数与rand函数的使用(纯干货)【易懂】
  6. 上传图片到OSS,并按指定大小范围压缩图片。完整工具类+三层调用
  7. 5 JMeter断言-Jmeter响应中出现乱码时
  8. 在python中设置静态变量
  9. JTextArea用法
  10. pfx证书导入方式,步骤流程