hypopg是一个RDS PostgreSQL的扩展,有助于了解特定索引是否可以提高查询的性能。虚拟索引并不是真实存在的索引,因此不耗费CPU、磁盘或其他资源,可以有效验证索引是否有效。
前提条件
实例内核小版本为20230830或以上。
重要20230830内核小版本之前已支持此插件,但为了规范插件管理,提升RDS PostgreSQL在插件侧的安全防护,RDS计划在内核版本迭代中陆续对部分存在安全风险的插件进行优化,部分插件在低内核小版本无法创建,更多信息,请参见【产品/功能变更】RDS PostgreSQL限制创建插件说明。
如果您的实例内核小版本低于20230830,且已经使用了此插件,则不影响使用。
如果您首次创建或重新创建此插件,请升级内核小版本到最新。
您的账号类型必须为高权限账号。您可以在RDS控制台目标实例的账号管理中查看您的账号权限类型。如果您的账号类型为普通账号,您需要创建高权限账号,创建详情请参见创建账号。
说明
暂不支持RDS PostgreSQL 17。
开启或关闭hypopg
说明
虚拟索引只在当前会话内有效。
开启hypopg。
CREATE EXTENSION hypopg;
说明仅高权限账号可以执行此命令。
关闭hypopg。
DROP EXTENSION hypopg;
说明仅高权限账号可以执行此命令。
调试示例
创建表并插入测试数据。
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 ;
查看默认执行计划。
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)
创建虚拟索引。
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)') ; indexrelid | indexname ------------+---------------------- 18284 | <18284>btree_hypo_id (1 row)
查看虚拟索引的效果。
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)
虚拟索引是“虚拟的”,并不会在实际运行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。