hypopg是一個RDS PostgreSQL的擴充,有助於瞭解特定索引是否可以提高查詢的效能。虛擬索引並不是真實存在的索引,因此不耗費CPU、磁碟或其他資源,可以有效驗證索引是否有效。
前提條件
執行個體核心小版本為20230830或以上。
重要20230830核心小版本之前已支援此外掛程式,但為了規範外掛程式管理,提升RDS PostgreSQL在外掛程式側的安全防護,RDS計劃在核心版本迭代中陸續對部分存在安全風險的外掛程式進行最佳化,部分外掛程式在低核心小版本無法建立,更多資訊,請參見【產品/功能變更】RDS PostgreSQL限制建立外掛程式說明。
如果您的執行個體核心小版本低於20230830,且已經使用了此外掛程式,則不影響使用。
如果您首次建立或重新建立此外掛程式,請升級核心小版本到最新。
您的帳號類型必須為高許可權帳號。您可以在RDS控制台目標執行個體的帳號管理中查看您的帳號權限類別型。如果您的帳號類型為普通帳號,您需要建立高許可權帳號,建立詳情請參見建立帳號。
開啟或關閉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。