Postgresql

使用表達式更改索引的定義而不刪除/重新創建索引

  • April 25, 2022

我處於一個特殊的情況:

我有多個索引以及使用函式的表達式。我想將它們切換到不同的函式,在那裡我可以保證函式的行為相同(因此索引值不會無效)。理想情況下,我不想刪除現有索引並重新索引它們,因為這需要更多的開發成本。

我可以在pg_index表格中看到,有一個indexprs列,其中包含索引的“內部”定義(該pg_indexes表格是這個的漂亮列印版本)。具體來說,我認為我確定了相關索引的格式類似於({FUNCEXPR :funcid 870 :funcresulttype 25 :funcretset false……

將其回溯funcid 870到 中information_schema.routines,我能夠將其與specific_name(包含此 funcid)相關聯,並且能夠確定它確實是我想要更改的特定功能。

理論上是否可以用新的funcid替換這個funcid,然后索引將引用新的函式?我該怎麼做,因為這個列是 pg_node_tree 類型的?如果沒有,有沒有辦法以一種非hacky的方式實現我的目標?

附錄:除非有一種被證明是安全的方法,否則我可能仍然會以“乾淨”的方式來做這件事,但這激起了我的興趣,足以提出一個問題。

如果你做得對,那會奏效,但我也不會那樣做。

但這還不夠:PostgreSQL 還通過 中的條目跟踪索引和函式之間的依賴關係pg_depend,因此您還必須修改相應的條目。否則,當您嘗試刪除索引時,您會收到有趣的錯誤消息。如果oid870 稍後碰巧被重新用於不同的功能,您還可能會遇到其他有趣的數據損壞方式。

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