Postgresql

使用 gist 和 gist__int_ops 創建緩慢的索引

  • December 8, 2019

我看到頻繁更新/插入表的性能問題,我的假設之一是我在 int 數組上的 gin 索引。

添加了 gin 索引,因為我們查詢了“X 是否存在於數組中?” 在高調的端點。

我創建了生產數據庫的一次性副本並刪除了索引並將其替換為 GIST 和 gist__int_ops 以檢查它的性能(因為它應該在頻繁更新的 /inserts 表上工作得更好)。

gist 索引創建永遠不會完成,我讓它執行了幾個小時,而另一方面沒有結果,gin 索引創建需要幾分鐘。

我嘗試清理數據 - 我有包含 50 到 120 個項目的數組,我刪除了它們,現在我的所有數據都是一個包含一個元素的數組,但索引創建仍然很慢。

DB:RDS 上的 PostgreSQL 11.5 (db.m4.4xlarge) 表大小:9373 MB

任何想法我可以在這裡做什麼?

我也遇到過這個問題,除了“不要使用 gist__int_ops”之外,還沒有找到解決方案。在大桌子上,picksplit 或懲罰函式似乎出現了病態錯誤。我不知道這是否是某人可以通過足夠的努力修復的錯誤,或者它是否是一個固有的問題。

(因為它應該在經常更新的 /inserts 表上工作得更好)

我不知道這個建議實際上(或曾經)有多好。請注意,它已從 9.5 版的文件中刪除。但是,如果您無論如何都無法完成建構,那麼對於您的情況來說,這肯定不是一個好的建議。

最可能的解釋是有一個並發會話在表上有一些鎖定並且是idle in transaction. 檢查pg_stat_activitypg_locks找到錯誤的會話並將pg_terminate_backend其終止。

由於這是從轉儲中新創建的數據庫,因此您不太可能遭受數據損壞。對於小於 10GB 的表,即使在託管數據庫上,小時也太長了。

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