PostgreSQL 商用版本EPAS(阿里云ppas) 索引推荐功能使用

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , PPAS , enterprisedb , 索引推荐


背景

PostgreSQL商用版本EnterpriseDB,内置了索引推荐功能,原理与这里描述类似。

《PostgreSQL SQL自动优化案例 - 极简,自动推荐索引》

目前仅支持BTREE索引的(单列或多列)推荐,(有一些限制,暂时不支持继承表的推荐,暂时不支持表达式索引的推荐)。

索引推荐用法

1、创建推荐存储表与推荐查阅函数。

-- 在需要用到索引推荐的数据库中,安装索引推荐用到的表、函数、视图   
-- 调用 index_advisor.sql    
psql -f $PGHOME/share/contrib/index_advisor.sql    
   
psql.bin:/opt/edb/as10/share/contrib/index_advisor.sql:22: ERROR:  relation "index_advisor_log" already exists   
psql.bin:/opt/edb/as10/share/contrib/index_advisor.sql:25: ERROR:  relation "ia_reloid" already exists   
psql.bin:/opt/edb/as10/share/contrib/index_advisor.sql:28: ERROR:  relation "ia_backend_pid" already exists   
CREATE FUNCTION   
CREATE FUNCTION   
CREATE VIEW   

2、加载推荐模块

-- 在需要用到索引推荐的会话中加载推荐模块   
load 'index_advisor';   

或者可以设置为自动加载。

vi $PGDATA/postgresql.conf   
   
shared_preload_libraries = 'index_advisor'   
   
   
# - Other Defaults -   
   
#dynamic_library_path = '$libdir'   
#local_preload_libraries = ''   
#session_preload_libraries = ''   
   
#oracle_home =''        # path to the Oracle home directory;   
                                        # only used by OCI Dblink; defaults   
                                        # to ORACLE_HOME environment variable.   

3、设置会话参数,选择是否需要推荐。如果需要推荐,则会自动对这个会话接下来的SQL进行索引推荐(如果多次执行,并被推荐的话,SQL都会被记录在表中)。

postgres=# set index_advisor.enabled TO on;   
SET   

设置后,这个会话的所有QUERY都会被推荐模块进行计算。并将需要推荐的SQL记录下来,包括PID,索引列,索引估算大小,成本估算等。

postgres=# select * from pgbench_history where bid=2;   
 tid  | bid |   aid   | delta |           mtime           | filler    
------+-----+---------+-------+---------------------------+--------   
  444 |   2 | 4438685 | -2029 | 12-JAN-18 20:46:43.07816  |    
   
postgres=# select pg_backend_pid();   
 pg_backend_pid    
----------------   
          32898   
(1 row)   
   
postgres=# select * from index_advisor_log ;   
 reloid |     relname      | attrs | benefit | index_size | backend_pid |            timestamp                
--------+------------------+-------+---------+------------+-------------+----------------------------------   
  16397 | pgbench_history  | {2}   |  175955 |    1260456 |       32898 | 14-JAN-18 21:32:19.564707 +08:00   

4、查阅推荐。

postgres=# select * from show_index_recommendations(32898);   
                                                      show_index_recommendations                                                         
--------------------------------------------------------------------------------------------------------------------------------------   
 create index idx_pgbench_history_bid on public.pgbench_history(bid);/* size: 1260456 KB, benefit: 175955, gain: 0.139596676718584 */   
(1 row)   
   
或   
   
postgres=# select * from show_index_recommendations();   
                                                      show_index_recommendations                                                         
--------------------------------------------------------------------------------------------------------------------------------------   
 create index idx_pgbench_history_bid on public.pgbench_history(bid);/* size: 1260456 KB, benefit: 175955, gain: 0.139596676718584 */   
(1 row)   

5、查看虚拟索引执行计划(HYPOTHETICAL PLAN 表示包含虚拟索引时的执行计划)。

postgres=# explain select * from pgbench_history where bid=2;   
                                             QUERY PLAN                                                 
-----------------------------------------------------------------------------------------------------   
 Gather  (cost=1000.00..455329.29 rows=470413 width=116)   
   Workers Planned: 6   
   ->  Parallel Seq Scan on pgbench_history  (cost=0.00..407287.99 rows=78402 width=116)   
         Filter: (bid = 2)   
 Result  (cost=0.00..0.00 rows=0 width=0)   
   One-Time Filter: '===[ HYPOTHETICAL PLAN ]==='::text   
   ->  Bitmap Heap Scan on pgbench_history  (cost=5339.17..279373.83 rows=470413 width=116)   
         Recheck Cond: (bid = 2)   
         ->  Bitmap Index Scan on "<hypothetical-index>:8"  (cost=0.00..5221.56 rows=470413 width=0)   
               Index Cond: (bid = 2)   
(10 rows)   

6、关闭推荐。

postgres=# set index_advisor.enabled TO off;   
SET   

关闭推荐后,不会使用虚拟索引,也不会再计算是否需要推荐索引。

postgres=# explain select * from pgbench_history where bid=2;   
                                       QUERY PLAN                                           
-----------------------------------------------------------------------------------------   
 Gather  (cost=1000.00..455329.29 rows=470413 width=116)   
   Workers Planned: 6   
   ->  Parallel Seq Scan on pgbench_history  (cost=0.00..407287.99 rows=78402 width=116)   
         Filter: (bid = 2)   
(4 rows)   

7、解读推荐索引信息。

postgres=# select * from show_index_recommendations();   
                                                      show_index_recommendations                                                         
--------------------------------------------------------------------------------------------------------------------------------------   
 create index idx_pgbench_history_bid on public.pgbench_history(bid);/* size: 1260456 KB, benefit: 175955, gain: 0.139596676718584 */   
(1 row)   

size,这个索引占用的空间,对应index_advisor_log.index_size。

benefit,这个推荐索引涉及的index_advisor_log.benefit,即加上索引后,相比没有索引时的explain成本估算COST差异。

gain,index_advisor_log -> sum(benefit)/greatest(size(s)),即多次推荐的统计,获得了多少提升空间,越大,表示提升效果越好。

如何让普通用户支持推荐

1、允许普通用户加载推荐模块

需要将$PGHOME/lib/index_advisor.so拷贝到$PGHOME/lib/plugins/index_advisor.so。普通用户才能LOAD。

2、允许普通用户增删改查推荐存储表

  • Grant SELECT and INSERT privileges on the index_advisor_log table to allow a user to invoke Index Advisor.

  • Grant DELETE privileges on the index_advisor_log table to allow the specified user to delete the table contents.

  • Grant SELECT privilege on the index_recommendations view.

推荐的配置

1、在template1模板库、以及已有的数据库(如果这些库需要使用索引推荐功能的话)中安装index_advisor.sql

psql template1 -f $PGHOME/share/contrib/index_advisor.sql    

psql template1 <<EOF
grant select,insert,delete on index_advisor_log to public;
grant select on index_recommendations to public;
EOF

2、配置postgresql.conf,默认加载模块

vi $PGDATA/postgresql.conf   
   
shared_preload_libraries = 'index_advisor'   

3、配置postgresql.conf,index_advisor.enabled=off,默认关闭计算

vi $PGDATA/postgresql.conf   
   
index_advisor.enabled=off   

4、当用户需要用到推荐模块时,只要打开index_advisor.enabled参数即可。

psql   
psql.bin (10.1.5)   
Type "help" for help.   
   
postgres=# show index_advisor.enabled ;   
 index_advisor.enabled    
-----------------------   
 off   
(1 row)   
   
postgres=# explain select * from pgbench_history where bid=2;   
                                       QUERY PLAN                                           
-----------------------------------------------------------------------------------------   
 Gather  (cost=1000.00..455329.29 rows=470413 width=116)   
   Workers Planned: 6   
   ->  Parallel Seq Scan on pgbench_history  (cost=0.00..407287.99 rows=78402 width=116)   
         Filter: (bid = 2)   
(4 rows)   
   
postgres=# set index_advisor.enabled =on;   
SET   
postgres=# explain select * from pgbench_history where bid=2;   
                                             QUERY PLAN                                                 
-----------------------------------------------------------------------------------------------------   
 Gather  (cost=1000.00..455329.29 rows=470413 width=116)   
   Workers Planned: 6   
   ->  Parallel Seq Scan on pgbench_history  (cost=0.00..407287.99 rows=78402 width=116)   
         Filter: (bid = 2)   
 Result  (cost=0.00..0.00 rows=0 width=0)   
   One-Time Filter: '===[ HYPOTHETICAL PLAN ]==='::text   
   ->  Bitmap Heap Scan on pgbench_history  (cost=5339.17..279373.83 rows=470413 width=116)   
         Recheck Cond: (bid = 2)   
         ->  Bitmap Index Scan on "<hypothetical-index>:2"  (cost=0.00..5221.56 rows=470413 width=0)   
               Index Cond: (bid = 2)   
(10 rows)   
   
postgres=# set index_advisor.enabled =off;   
SET   

参考

《PostgreSQL SQL自动优化案例 - 极简,自动推荐索引》

阿里云PPAS商用版本(兼容Oracle)

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.36.html#pID0E0ZUE0HA

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
关系型数据库 Serverless 分布式数据库
【公测】PolarDB PostgreSQL版Serverless功能免费使用​!
【公测】PolarDB PostgreSQL版Serverless功能免费使用​,公测于2024年3月28日开始,持续三个月,公测期间可以免费使用!
|
2月前
|
域名解析 网络协议 Serverless
阿里云DNS常见问题之阿里云DNS不再支持自定义NS名称功能如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
12天前
|
Cloud Native 关系型数据库 OLAP
云原生数据仓库产品使用合集之阿里云云原生数据仓库AnalyticDB PostgreSQL版的重分布时间主要取决的是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
2月前
|
关系型数据库 Serverless 分布式数据库
PolarDB PostgreSQL版Serverless功能上线公测啦,公测期间免费使用!
Serverless数据库能够使得数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。PolarDB PostgreSQL版 Serverless提供了CPU、内存、存储、网络资源的实时弹性能力,构建计算与存储分离架构下的 PolarDB PostgreSQL版产品新形态。
|
12天前
|
SQL 运维 关系型数据库
PolarDB产品使用合集之PolarDB 2.3.0 版本的 CDC 功能支持 Polardb-X 到 Polardb-X 的数据同步吗
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
12天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用合集之PolarDB MySQL标准版中带有分区功能吗
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
12天前
|
SQL 数据管理 API
数据管理DMS产品使用合集之阿里云DMS提供API接口来进行数据导出功能吗
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
17天前
|
人工智能 定位技术 云计算
阿里云+Salesforce:更多功能,上新!
阿里云+Salesforce:更多功能,上新!
20 1
|
1月前
|
应用服务中间件 API 开发工具
阿里云视频点播功能
阿里云视频点播功能
16 0
|
1月前
|
弹性计算 Ubuntu 网络协议
阿里云CDN功能Quick Start
本文通过在国外Region ECS创建ECS,通过ECS部署应用,然后使用CDN加速部署应用,全链路测试体验阿里云CDN通过IP加速服务的功能。

相关产品

  • 云原生数据库 PolarDB