是否有工具或方法來分析Postgres,並確定應該創建哪些缺失的索引以及哪些未使用的索引應該被刪除?我對SQLServer的「profiler」工具有一點經驗,但我不知道Postgres中包含了類似的工具。PostgreSQL索引使用分析
回答
我喜歡尋找失蹤指標:
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可以幫助...
要使用帶引號的標識符進行此項工作,請將查詢更改爲: '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
的輸出這個查詢應該被解釋爲使答案更有幫助 – cen 2017-01-31 11:25:55
在@cen的時候,當'too_much_seq'是積極的和大的,你應該關心。 – mountainclimber 2017-09-27 18:11:09
這應有助於:Pratical Query Analysis
PQA的最近更新已有幾年的歷史。它有一個不被pgFouine支持的功能嗎? – guettli 2012-10-10 10:55:04
在確定失蹤指標接近....都能跟得上。但是有一些計劃在未來的版本中使這更容易,比如僞索引和機器可讀的EXPLAIN。
目前,您需要EXPLAIN ANALYZE
性能較差的查詢,然後手動確定最佳路線。一些日誌分析器如pgFouine可以幫助確定查詢。
至於未使用的指標,可以使用類似以下內容,以幫助確定他們:
select * from pg_stat_all_indexes where schemaname <> 'pg_catalog';
這將有助於識別元組讀取,掃描,牽強。
Frank Heikens還指出了其他地方查詢當前索引使用情況的好地方。 – rfusca 2010-07-23 14:22:40
查看統計。 pg_stat_user_tables
和pg_stat_user_indexes
是開始。請參閱「The Statistics Collector」。
有多個腳本鏈接可幫助您在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
計數會增加。當表格索引不足以回答對它的查詢時,這可能會提示您。
其實搞清楚應該索引哪些列?這通常會再次導致查詢日誌分析。
PoWA似乎是PostgreSQL 9.4+的一個有趣的工具。它收集統計數據,將它們可視化,並建議索引。它使用pg_stat_statements
擴展名。
PoWA是PostgreSQL工作負載分析器,它收集性能統計信息並提供實時圖表來幫助監視和調整PostgreSQL服務器。它類似於Oracle AWR或SQL Server MDW。
分析PostgreSQL的另一個新的有趣的工具是PgHero。它更側重於調整數據庫並進行大量分析和建議。
您可以使用以下查詢來查找索引使用情況和索引的大小:
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;
- 1. 性能:使用索引和分區(PostgreSQL)
- 2. 使用Rails/Postgresql索引多列索引
- 3. Postgresql索引未使用
- 4. Elasticsearch使用索引(分析器)只有
- 5. Solr索引分析
- 6. 故障使用dplyr :: TBL引用的PostgreSQL(振幅分析)表
- 7. 分析函數索引First_Value
- 8. 唯一索引在PostgreSQL的分區
- 9. 模數分表,如何索引? PostgreSQL的
- 10. PostgreSQL查詢不使用生產索引
- 11. Postgresql計劃器使用錯誤索引
- 12. Postgresql不使用我的索引
- 13. postgresql索引使用 - 加號和減號
- 14. Postgresql,使用索引與之間
- 15. 使用Postgresql進行RFM分析
- 16. 如何在postgresql中的分區表上使用索引8.3.7
- 17. Postgresql部分索引超過最大索引行大小
- 18. 爲什麼不使用PostgreSQL索引並建議索引
- 19. 錯誤的索引彈性搜索使用分析器
- 20. 分析器用於創建Lucene索引
- 21. 彈性搜索索引未被分析
- 22. 索引PostgreSQL Hstore Keys
- 23. PostgreSQL裏的索引
- 24. Postgresql併發索引
- 25. PostgreSQL索引優化
- 26. 分析,分類和索引元數據
- 27. PostgreSQL索引如何引用行?
- 28. 使用不同的查詢和索引時間分析器創建elasticsearch索引
- 29. 當保持索引 - 分析在SQL Server索引的使用統計中2008
- 30. 使用PostgreSQL中的約束對ORDER BY使用的索引進行索引
原來是這樣。有一段時間沒有看過這個。更新了我接受的答案。 – Cerin 2015-01-08 15:21:52