2010-07-23 66 views
67

是否有工具或方法來分析Postgres,並確定應該創建哪些缺失的索引以及哪些未使用的索引應該被刪除?我對SQLServer的「profiler」工具有一點經驗,但我不知道Postgres中包含了類似的工具。PostgreSQL索引使用分析

+0

原來是這樣。有一段時間沒有看過這個。更新了我接受的答案。 – Cerin 2015-01-08 15:21:52

回答

128

我喜歡尋找失蹤指標:

SELECT schemaname, relname, seq_scan-idx_scan AS too_much_seq, case when seq_scan-idx_scan>0 THEN 'Missing Index?' ELSE 'OK' END, pg_relation_size(format('%I.%I', schemaname, relname)::regclass) AS rel_size, seq_scan, idx_scan 
FROM pg_stat_user_tables 
WHERE pg_relation_size(format('%I.%I', schemaname, relname)::regclass)>80000 ORDER BY too_much_seq DESC; 

此檢查是否有更多的順序掃描,然後索引掃描。如果表格很小,它會被忽略,因爲Postgres似乎更喜歡它們的順序掃描。

上面的查詢確實顯示缺少索引。

下一步將檢測缺失的組合索引。我想這不容易,但可行。也許分析緩慢的查詢...我聽到pg_stat_statements可以幫助...

+7

要使用帶引號的標識符進行此項工作,請將查詢更改爲: 'SELECT relname,seq_scan-idx_scan AS too_much_seq,seq_scan-idx_scan> 0時的情況那麼'缺少索引?' ELSE 'OK' END, pg_relation_size(RELID :: regclass的)AS rel_size,seq_scan,idx_scan FROM pg_stat_sys_tables和pg_stat_all_tables WHERE SCHEMANAME = '公共' AND pg_relation_size(RELID :: regclass的)> 80000 ORDER BY too_much_seq DESC;' – 2016-01-20 16:30:26

+7

的輸出這個查詢應該被解釋爲使答案更有幫助 – cen 2017-01-31 11:25:55

+0

在@cen的時候,當'too_much_seq'是積極的和大的,你應該關心。 – mountainclimber 2017-09-27 18:11:09

-1

這應有助於:Pratical Query Analysis

+1

PQA的最近更新已有幾年的歷史。它有一個不被pgFouine支持的功能嗎? – guettli 2012-10-10 10:55:04

8

在確定失蹤指標接近....都能跟得上。但是有一些計劃在未來的版本中使這更容易,比如僞索引和機器可讀的EXPLAIN。

目前,您需要EXPLAIN ANALYZE性能較差的查詢,然後手動確定最佳路線。一些日誌分析器如pgFouine可以幫助確定查詢。

至於未使用的指標,可以使用類似以下內容,以幫助確定他們:

select * from pg_stat_all_indexes where schemaname <> 'pg_catalog'; 

這將有助於識別元組讀取,掃描,牽強。

+0

Frank Heikens還指出了其他地方查詢當前索引使用情況的好地方。 – rfusca 2010-07-23 14:22:40

3

有多個腳本鏈接可幫助您在PostgreSQL wiki處找到未使用的索引。基本技術是查看pg_stat_user_indexes並查找其中idx_scan(該索引用於回答查詢的次數)爲零或至少非常低的次數。如果應用程序發生了變化,而且以前使用的索引可能不是現在,則有時必須運行pg_stat_reset()才能將所有統計數據恢復爲0,然後收集新數據;你可以保存當前所有值並計算增量,而不是計算出來。

目前還沒有好的工具可用於建議缺失的索引。一種方法是記錄正在運行的查詢,並分析哪些查詢需要很長時間才能使用查詢日誌分析工具(如pgFouine或pqa)運行。有關更多信息,請參閱「Logging Difficult Queries」。

另一種方法是查看pg_stat_user_tables並查找對其有大量順序掃描的表,其中seq_tup_fetch很大。當使用索引時,idx_fetch_tup計數會增加。當表格索引不足以回答對它的查詢時,這可能會提示您。

其實搞清楚應該索引哪些列?這通常會再次導致查詢日誌分析。

0

PoWA似乎是PostgreSQL 9.4+的一個有趣的工具。它收集統計數據,將它們可視化,並建議索引。它使用pg_stat_statements擴展名。

PoWA是PostgreSQL工作負載分析器,它收集性能統計信息並提供實時圖表來幫助監視和調整PostgreSQL服務器。它類似於Oracle AWR或SQL Server MDW。

5

分析PostgreSQL的另一個新的有趣的工具是PgHero。它更側重於調整數據庫並進行大量分析和建議。

screenshot

1

您可以使用以下查詢來查找索引使用情況和索引的大小:

Reference is taken from this blog.

SELECT 
    pt.tablename AS TableName 
    ,t.indexname AS IndexName 
    ,pc.reltuples AS TotalRows 
    ,pg_size_pretty(pg_relation_size(quote_ident(pt.tablename)::text)) AS TableSize 
    ,pg_size_pretty(pg_relation_size(quote_ident(t.indexrelname)::text)) AS IndexSize 
    ,t.idx_scan AS TotalNumberOfScan 
    ,t.idx_tup_read AS TotalTupleRead 
    ,t.idx_tup_fetch AS TotalTupleFetched 
FROM pg_tables AS pt 
LEFT OUTER JOIN pg_class AS pc 
    ON pt.tablename=pc.relname 
LEFT OUTER JOIN 
( 
    SELECT 
     pc.relname AS TableName 
     ,pc2.relname AS IndexName 
     ,psai.idx_scan 
     ,psai.idx_tup_read 
     ,psai.idx_tup_fetch 
     ,psai.indexrelname 
    FROM pg_index AS pi 
    JOIN pg_class AS pc 
     ON pc.oid = pi.indrelid 
    JOIN pg_class AS pc2 
     ON pc2.oid = pi.indexrelid 
    JOIN pg_stat_all_indexes AS psai 
     ON pi.indexrelid = psai.indexrelid 
)AS T 
    ON pt.tablename = T.TableName 
WHERE pt.schemaname='public' 
ORDER BY 1;