Postgresql

字元變化索引成本和長度限制

  • June 27, 2014

我對字元變化列有一個獨特的約束,該列的長度大部分約為 600,但可能達到 1000 萬。

我已經閱讀過B-Trees,但我無法確定索引將消耗多少磁碟空間,或者這樣大的值是否會阻止索引正常執行。

B-Tree 索引對具有如此大長度的字元變化列的磁碟空間和時間有什麼影響?

在 Postgres 中,唯一約束是用唯一的B-tree index實現的。根據文件:

添加唯一約束將自動在約束中使用的列或列組上創建唯一 btree 索引。

索引使用與表相同的基本儲存機制:數據頁數組。索引有一些小的附加功能。根據文件:

在表格中,一個項目是一行;在索引中,一個項目是一個索引條目。

每個表和索引都儲存為一個固定大小的頁面數組(通常為 8 kB,儘管在編譯伺服器時可以選擇不同的頁面大小)。

索引條目的最大大小是數據頁的三分之一,我在此引用 Peter Eisentraut:

PostgreSQL 主鍵長度限制

那是2730 字節(或更少)。這意味著您的UNIQUE約束是不可能的

我會考慮添加一個帶有雜湊值的冗餘列並在其上創建一個唯一索引

您可以使用內置函式md5()或更有效的方法來獲取巨大的值。

這是一個關注性能的相關解決方案:

Index max row size error

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