hypopg是一个RDS PostgreSQL的扩展,有助于了解特定索引是否可以提高问题查询的性能。虚拟索引并不是真实存在的索引,因此不耗费CPU、磁盘或其他资源,可以有效验证索引是否有效。

前提条件

  • RDS PostgreSQL实例内核小版本升级到20220130。查看和升级内核小版本,请参见升级内核小版本
  • 您的账号类型必须为高权限账号。您可以在RDS控制台目标实例的账号管理中查看您的账号权限类型。如果您的账号类型为普通账号,您需要创建高权限账号,创建详情请参见创建账号

开启或关闭hypopg

说明 虚拟索引只在当前会话内有效。
  • 开启hypopg。
    CREATE EXTENSION hypopg;
    说明 仅高权限账号可以执行此命令。
  • 关闭hypopg。
    DROP EXTENSION hypopg;
    说明 仅高权限账号可以执行此命令。

调试示例

  1. 创建表并插入测试数据。
    create extension hypopg;
    
    CREATE TABLE hypo (id integer, val text) ;
    INSERT INTO hypo SELECT i, 'line ' || i FROM generate_series(1, 100000) i ;
    VACUUM ANALYZE hypo ;
  2. 查看默认执行计划。
    EXPLAIN SELECT val FROM hypo WHERE id = 1;
                           QUERY PLAN
    --------------------------------------------------------
     Seq Scan on hypo  (cost=0.00..1791.00 rows=1 width=14)
       Filter: (id = 1)
    (2 rows)
  3. 创建虚拟索引。
    SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)') ;
     indexrelid |      indexname
    ------------+----------------------
          18284 | <18284>btree_hypo_id
    (1 row)
  4. 查看虚拟索引的效果。
    EXPLAIN SELECT val FROM hypo WHERE id = 1;
                                        QUERY PLAN
    ----------------------------------------------------------------------------------
     Index Scan using <18284>btree_hypo_id on hypo  (cost=0.04..8.06 rows=1 width=10)
       Index Cond: (id = 1)
    (2 rows)
  5. 虚拟索引是“虚拟的”,并不会在实际运行SQL语句时使用。可以查看SQL实际的运行计划。
    EXPLAIN ANALYZE SELECT val FROM hypo WHERE id = 1;
                                                QUERY PLAN
    ---------------------------------------------------------------------------------------------------
     Seq Scan on hypo  (cost=0.00..1791.00 rows=1 width=10) (actual time=0.046..46.390 rows=1 loops=1)
       Filter: (id = 1)
       Rows Removed by Filter: 99999
     Planning time: 0.160 ms
     Execution time: 46.460 ms
    (5 rows)

相关参考

关于hypopg的更多详细说明,请参见HypoPG