Postgresql

postgres 中的杜松子酒索引

  • October 2, 2019

我有四列 project_id、custom_event(boolean)、page_view(boolean)、event_url(text)。我通常喜歡 event_url 列中的正則表達式操作,我的查詢將是我指定的順序中的所有四列。當我嘗試這樣創建時

CREATE INDEX event_url_index ON event_data
 USING gin (project_id, custom_event, page_view, event_url gin_trgm_ops)

它給了我這樣的錯誤

數據類型 boolean 沒有訪問方法“gin”的預設運算符類

誰能幫我解決這個問題?

正如另一個答案所說,即使支持它也可能無法正常工作(從 v11 開始用於 bool)。四列 GIN 索引與 4 個單列 GIN 索引實際上並沒有太大區別。並且布爾列本身不太可能有幫助,因為返回一半索引的成本可能會超過它的幫助。通過將三個標量組合到一個 btree 索引中,您可以很好地最大化選擇性和最小化成本(它在 v10 中有效)。如果布爾值的分佈是不平衡的,那麼創建部分索引可能會有所幫助,您只需要索引較稀有的布爾值的行。

另一種可能性是使用 GiST 索引而不是 GIN

CREATE INDEX event_url_index ON event_data
 USING gist (project_id, custom_event, page_view, event_url gist_trgm_ops)

多列 GiST 索引可以以非常有針對性的有用方式組合列。然而,基於簽名的 GiST 索引在被過度填充時也會非常嚴重地退化,並且很難預測何時會發生這種情況。所以你必須在你的真實數據集上測試它們。您可能還想嘗試不同的排序(例如,將布爾值放在最後,或者完全不考慮它們)。

要在列上創建 GIN 索引boolean,您必須

CREATE EXTENSION btree_gin;

但是這個索引是毫無意義的,因為 PostgreSQL 不能使用像這樣的組合 GIN 索引來同時對字元串和其他條件進行三元組匹配。

如果其他條件充分縮小了搜尋範圍,請考慮創建兩個索引:字元串列上的三元組索引和其他列上的正常 B 樹索引。PostgreSQL 可以使用 BitmapAnd 組合這兩個索引。

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