索引顧問(Index Advisor)可以幫助您確定應該對哪些列編制索引,以提高指定工作負載中的性能。索引顧問僅識別二叉樹類型索引(單列或復合),不識別可提高性能的其他索引類型,例如GIN、GiST、Hash等。
索引顧問簡介
索引顧問會嘗試對INSERT、UPDATE、DELETE和SELECT語句提出索引編制建議。當調用索引顧問時,您將以一個EXPLAIN語句形式的形式提供工作負載。索引顧問為提供的查詢顯示查詢計劃和估計執行開銷,但不實際執行查詢。
在分析期間,索引顧問會對使用假設索引和不使用假設索引的查詢執行開銷進行比較。如果使用假設索引的執行開銷低于不使用假設索引的執行開銷,則將在EXPLAIN語句輸出中報告這兩個計劃,計算量化改進的指標,并且索引顧問會生成創建索引所需的CREATE INDEX語句。
如果未找到降低執行開銷的假設索引,則索引顧問會只顯示EXPLAIN語句的原始查詢計劃輸出,并不會實際在表上創建索引。您可以使用由索引顧問提供的CREATE INDEX語句向表添加任何建議的索引。
執行CREATE EXTENSION index_advisor會創建index_advisor_log表、show_index_recommendations()函數和index_recommendations視圖,索引顧問在該表中存儲分析生成的索引編制建議,使用提供的函數和視圖,可以簡化對結果的檢索和解釋。
注意事項
- 索引顧問不考慮Index-Only Scan掃描,它在提出建議時考慮索引掃描。
- 索引顧問會忽略WHERE子句中找到的任何計算。建議中的索引字段不會是任何類型的表達式,該字段將是一個簡單的列名。
- 建議假設索引時,索引顧問不考慮繼承。如果查詢引用父表,索引顧問不對子表提出任何索引建議。
- 在恢復pg_dump備份文件(包括index_advisor_log表或對其提出索引編制建議并將這些建議存儲在index_advisor_log表中的任何表)期間,可能會因對象標識符(OID)中的更改導致index_advisor_log表與恢復的表(由index_advisor_log表中的行引用)之間斷開鏈接。
- 如果有必要在備份之前顯示所提出的建議,您可以使用SQL UPDATE語句將index_advisor_log表中reloid列的舊OID替換為被引用表的新OID:
UPDATE index_advisor_log SET reloid = new_oid WHERE reloid = old_oid;
索引顧問組件
組件 | 說明 |
---|---|
index_advisor_log | 索引顧問會將索引編制建議記錄在Index_advisor_log表中。 |
show_index_recommendations() | show_index_recommendations()一個PL/pgSQL函數,它解釋并顯示特定的索引顧問會話(由其后端進程ID標識)期間提出的建議。 |
index_recommendations | 索引顧問根據查詢分析期間存儲在index_advisor_log表中的信息,創建index_recommendations視圖。該視圖所生成輸出的格式與show_index_recommendations()函數的相同,但包含所有存儲會話的索引顧問建議,而show_index_recommendations()函數返回的結果集僅限于指定的會話。 |
使用索引顧問
使用索引顧問的示例中使用的表通過如下語句創建:
CREATE TABLE t( a INT, b INT );
INSERT INTO t SELECT s, 99999 - s FROM generate_series(0,99999) AS s;
ANALYZE t;
所生成的表包含以下各行:
a | b
-------+-------
0 | 99999
1 | 99998
2 | 99997
3 | 99996
.
.
.
99997 | 2
99998 | 1
99999 | 0
加載索引顧問插件后,索引顧問會分析所有SQL語句,并記錄會話期間的所有索引編制建議:
- 如果您希望在不實際執行查詢的情況下讓索引顧問分析查詢并提出索引編制建議,將EXPLAIN關鍵字作為SQL語句的前綴即可實現。
- 如果語句不帶EXPLAIN關鍵字前綴,索引顧問將在語句執行期間分析語句,并將索引編制建議寫入index_advisor_log表以供日后查看。