
# 使用hypopg插件
#### 简介
hypopg是一个RDS for PostgreSQL的扩展，有助于了解特定索引是否可以提高问题查询的性能。虚拟索引并不是真实存在的索引，因此创建时不会消耗CPU、磁盘或其他资源，就可以验证索引是否有效。
更多信息可参见[hypopg官方文档](https://github.com/HypoPG/hypopg)。
#### 支持的版本说明
PostgreSQL 11及以上版本的最新小版本支持该插件。可通过以下SQL语句查询当前实例是否支持该插件：
```
SELECT * FROM pg_available_extension_versions WHERE name = 'hypopg';
```
如果不支持，可通过[升级内核小版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0003.html)或者[使用转储与还原升级大版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0053.html)使用该插件。
RDS for PostgreSQL实例支持的插件，具体请参见[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
#### 插件介绍
hypopg插件是RDS for PostgreSQL支持的一款开源第三方插件，hypopg创建的虚拟索引不会存在于任何系统表中，而是存放在连接的私有内存中。由于虚拟索引实际上并不真正存在于任何物理文件中，因此hypopg保证了虚拟索引只会被一个简单的**EXPLAIN** 语句使用（不包括**ANALYZE**选项）。虚拟索引并不是真实存在的索引，因此不耗费CPU、磁盘或其他资源。
![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
hypopg插件支持的索引类型如下：
- BTREE：B型树索引。
- BRIN：块级索引。
- HASH：哈希索引。
- BLOOM：布隆索引（需要先安装bloom插件）。
 
#### 插件安装与卸载
- 安装插件
  ```
  SELECT control_extension ('create', 'hypopg');
  ```
  
- 卸载插件
  ```
  SELECT control_extension ('drop', 'hypopg');
  ```
  
更多信息，请参见[通过界面安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0070.html)和[通过SQL命令安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0043.html)。
#### 基本使用
1. 安装hypopg插件。
   ```
   SELECT control_extension ('create', 'hypopg');
   ```
   
2. 创建表并插入测试数据。
   ```
   CREATE TABLE t (id int, col text) ;
   INSERT INTO t select x as id,'col '||x from generate_series(1,100000) as x;
   ```
   
3. 查看默认执行计划。
   ```
   EXPLAIN SELECT * FROM t WHERE id = 1;
                          QUERY PLAN
   --------------------------------------------------------
    Seq Scan on t  (cost=0.00..1399.84 rows=344 width=36)
      Filter: (id = 1)
   (2 rows)
   ```
   
4. 创建虚拟索引。
   ```
   SELECT hypopg_create_index('CREATE INDEX ON t (id)') ;
    hypopg_create_index    
   ---------------------------
   (14737,<14737>btree_t_id)
   (1 row)
   ```
   表1参数说明 
   | 参数                  | 说明         |
   |:---|:---|
   | 14737               | 虚拟索引的标识符。  |
   | \<14737\>btree_t_id | 生成的虚拟索引名称。 |
      
   
5. 再次运行EXPLAIN查看PostgreSQL会使用此虚拟索引。
   ```
   EXPLAIN SELECT * FROM t WHERE id = 1;
                                       QUERY PLAN
   ----------------------------------------------------------------------------------
    Index Scan using "<14737>btree_t_id" on t  (cost=0.04..2.26 rows=1 width=13)
       Index Cond: (id = 1)
   (2 rows)
   ```
   
6. 虚拟索引是"虚拟的"，并不会在实际运行SQL语句时使用。可以查看SQL实际的运行计划。
   ```
   EXPLAIN ANALYZE SELECT * FROM t WHERE id = 1;
                                               QUERY PLAN
   ---------------------------------------------------------------------------------------------------
    Seq Scan on t  (cost=0.00..1791.00 rows=1 width=13) (actual time=0.010..5.378 rows=1 loops=1)
      Filter: (id = 1)
      Rows Removed by Filter: 99999
    Planning Time: 0.036 ms
    Execution Time: 5.401 ms
   (5 rows)
   ```
   
 
