PostgreSQL hint用法(兼容oracle)
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)相关推荐
- oracle listagg支持,PostgreSQL行列转换(兼容oracle listagg)
oracle11g开始支持的listagg函数替代了wmconcat来实现行列转换的功能. listagg函数的用法: oracle行列转换例子: -建表https://www.cndba.cn/fo ...
- PostgreSQL隐藏列(兼容oracle)
oracle 12cR1新增了隐藏列的功能,在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件,现在我们可以通过隐藏列来实现这一功能. ...
- postgres oracle 兼容,PostgreSQL嵌套表(兼容oracle)
oracle中的嵌套表是某些行的集合,它在主表中表示为其中的一列.对主表中的每一条记录,嵌套表可以包含多个行. 通俗地说,嵌套表就是表中的表,把一个表中的字段定义为一个表,这个字段表的数据存储在外部的 ...
- PostgreSQL实现USERENV函数(兼容oracle)
oracle中使用USERENV 函数来获取当前会话变量的函数,支持的参数有: CLINET_INFO 返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_IN ...
- Oracle的hint的作用,Oracle Hint 用法
正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+ */ 和注释很像,比注释多了一个"+ ...
- Oracle调优之Hint用法整理笔记
整理工作中用到的Hint,不定时更新,Hint是oracle早期因为oracle优化器还不是很完善加上去的,可以辅助oracle优化器,Hint 是Oracle 提供的一种SQL语法,常用于SQL调优 ...
- oracle中orand使用,Postgres兼容Oracle研究——orafce调研
一.背景 PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面.甚至大多数的日常应用的性能也不会输给Oracle. 但是Oracle有些函数或者包,默认Po ...
- oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?
作者介绍 洪烨,openGauss Contributor,多年银行业系统架构设计及DBA实战经验,<DB2数据库内部解析与性能调优>作者. openGauss的前世今生 上一篇看到很多朋 ...
- 达梦数据库兼容Oracle之SQL语法(一)
对于刚从Oracle数据库转到达梦数据库,SQL语法的使用基本一致,有一些差别,下面总结的一些常用SQL语法差别. 文章目录 1.导入数据 2.返回查询数据的返回行 3 外连接用法 4.多列IN用法 ...
最新文章
- django学习笔记【003】创建第一个带有model的app
- 【组队学习】孙健坤:基于Python的会员数据化运营
- CC2540开发板学习笔记(一)——LED点亮
- ACS AD 和本地验证SSL ×××
- mysql 查看最近的语句_查看MySQL最近执行的语句
- OWIN的理解和实践(三) –Middleware开发入门
- Struts 学习笔记2(输入校验、国际化、异常处理)
- BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
- [禅悟人生]心平气和, 慢慢修行
- ubuntu c++检测usb口事件变化_拆解报告:美式双USBA口充电插座
- Chapter3-2_Speech Separation(TasNet)
- Oracle中给表添加主键 外键,给表中添加主键、外键
- 官方澄清丨Gartner并未组织评选OpenStack八大厂商
- matlab6数学建模基础教程,《数学建模基础教程》.pdf
- 【YBT2022寒假Day1 B】方格填写(插头DP)
- html p 标签文字换行与不换行以及文字隐藏
- 参考文献起止页码怎么写_期刊作为参考文献要求有年卷期和起止页码,怎么查这些页码什么的...
- 利用useRef hooks 解决 定时器关闭不到的问题
- ubuntu下使用 RabbitVCSRapidSVN
- 输入一个字符,判断输入的是控制字符、数字、大小写字母还是其他字符,并给出相应提示