2016-01-03 81 views
1

據的Postgres pg_stat_statements文檔:使用pg_stat_statements收集大型統計集?

該模塊需要成比例 pg_stat_statements.max附加共享內存。請注意,只要加載了 模塊,即使將pg_stat_statements.track設置爲none,也會消耗該內存。

和也:

代表查詢的文本保存在外部磁盤文件, 不消耗共享內存。因此,即使很長的查詢文本 可以成功存儲。但是,如果很多長查詢文本累積了 ,那麼外部文件可能會變得難以管理地變大。

從這些不清楚高pg_stat_statements.max的實際內存成本是什麼 - 比如在100k或500k(默認值是5k)。設定高的水平是否安全,可能是這種高水平的負面影響?通過logstash/fluentd將統計信息彙總到外部數據庫是否是超過特定大小的首選方法?

回答

2

1.

從我已閱讀,它散列查詢,並保持它在DB,保存文本FS。所以,接下來的問題是更期望的那麼超載共享內存:

如果有很多長的查詢文本積累,外部文件可能會增長 無法管理大

文本的哈希小得如此多則文字,我認爲你不應該擔心擴展內存消耗比較長的查詢。尤其是知道擴展使用查詢分析器(其將用於工作EVERY查詢ANYWAY):

的queryid哈希值被計算對後解析分析的查詢的 表示

設置pg_stat_statements.max我相信,10倍大的共享內存應該佔用更多的共享內存。增長應該是線性它在文檔中沒有這麼說,但邏輯上應該如此。

如果安全或不設置設置爲不同值,因爲沒有關於其他配置值和硬件的數據,所以沒有答案。但是,隨着增長應該是線性的,請考慮這個答案:「如果將它設置爲5K,並且查詢運行時幾乎沒有增長,那麼將其設置爲50K將使其延長几乎沒有10倍。順便說一句,我的問題 - 誰是鑼挖50000緩慢的陳述? :)

2。

此擴展已經爲「dis-valued」語句做了預先聚合。您可以直接在數據庫上選擇它,因此將數據移動到其他數據庫並在其中選擇它只會爲您提供卸載原始數據庫和加載其他數據庫的好處。換句話說,您可以爲原始查詢節省50MB,但在另一個上花費相同。是否有意義?對我來說 - 是的。這是我自己做的。但我也保存語句的執行計劃(這不是pg_stat_statements擴展的一部分)。我相信這取決於你有什麼和你有什麼。絕對沒有必要僅僅因爲一些查詢。同樣,除非你有這麼大的文件擴展名可以

如果這發生在一個恢復的方法,pg_stat_statements可以選擇 放棄查詢文本,於是在 pg_stat_statements所有現有項目視圖將顯示空查詢字段

+0

我正在運行大量物化視圖,因此需要很高的'pg_stat_statements.max' :)不要太擔心硬盤空間,主要是內存使用量會降低實際查詢性能。 >這是我自己做的。如果您可以分享一些關於首選設置的信息,以及您是如何處理從統計信息收集中卸載主數據庫的? – user3467349

+0

大文件威脅不是用於硬盤空間,而是用於分析它的時間。嘗試查詢pg_stat_statements作爲超級用戶(讀取語句表單文件),而不是超級用戶(沒有語句)。如果你有大文件,時間差異顯着。 –

+0

我所做的是一個修補程序樣式設置 - 不是最佳的,但是這裏是:我已經將最大值設置爲1000(而不是最低值5次)。我有一份工作,將pg_stat_statements複製到其他數據庫與dblink(沒有查詢,但與它的散列),另一個作業發送散列和查詢到不同的表(與FK)。和另一個保存當前執行計劃的作業,並使用散列(FK)將其發送到第三個表。通過這種方式,我可以比較執行時間和計劃是否隨時間發生變化......(Oracle在CBO中內置了類似的東西) –