Postgresql

Postgres 12 - 我應該在哪些情況下啟動查詢和索引統計收集器

  • October 27, 2021

TL;DR - 我還沒有啟動收集器,它似乎不是預設的;這有多糟糕,我應該啟動它嗎?

  • 我剛剛在查詢速度很慢的表上創建了一個新索引。
  • 我通過Explain在查詢上執行並在表/查詢列的各種組合上創建索引來做到這一點。
  • 再次執行後,我沒收了未使用的索引Explain,保留了已使用的索引
  • 然後我決定檢查為該表收集的統計資訊。事實證明,SELECT schemaname, relname, last_analyze FROM pg_stat_all_tables WHERE relname = '<MY TABLE>';最後一次分析返回 NULL。
  • 檢查postgresql.conf我發現目前我根本沒有分析…
...
#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------

# - Query and Index Statistics Collector -

#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none         # none, pl, all
#track_activity_query_size = 1024   # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'
...

我的問題

  1. 查詢規劃器是否仍然有足夠的資訊來知道何時進行索引與進行全表掃描等?
  2. 什麼時候應該考慮啟動查詢和索引統計收集器?(總是,僅在某些情況下,…)

統計收集器已經啟動,不用擔心。

請注意,統計資訊收集器收集的統計資訊不是優化器使用的表統計資訊,而是有關數據庫工作負載的數據。

表統計資訊由 autovacuum 收集,預設情況下也啟用。

兩者之間存在聯繫,因為 autovacuum 依賴於統計收集器收集的統計資訊來知道何時應該ANALYZE使用表。

您是否對 conf 文件中的設置被註釋掉感到困惑?被註釋掉並不意味著它是關閉的,它意味著它有它的編譯預設值,即ontrack_activities 和 track_counts。(我也會打開 track_io_timings——計劃者不使用它,但為您提供了很好的資訊)。

“pg_stat_all_tables”中的數據不是很持久。每次伺服器崩潰或立即關閉或呼叫 pg_stat_reset() 時,它都會失去。現在所有這些東西在生產伺服器上應該是非常罕見的,但也許您沒有使用生產伺服器進行測試,而且無論如何它們並不總是像應有的那樣罕見。如果您改為查看 pg_stats,這將使您更好地了解分析是否真的曾經在表上執行過。

引用自:https://dba.stackexchange.com/questions/301747