4

我创建了一个表 answers 并在其中添加了以下索引:

add_index :answers, [:output, :question_id], unique: true

该索引允许通过其输出和 question_id 快速查找答案。创建许多答案时,出现以下错误:

PG::ProgramLimitExceeded: 错误:索引行大小 3088 超过索引
“index_answers_on_output_and_question_id”的最大值 2712
提示:无法索引大于缓冲区页面 1/3 的值。
考虑值的 MD5 散列的函数索引,或使用全文索引。

我该如何解决这个问题?我可以将唯一性方面移到模型中,但索引很重要。Rails 是否支持创建 MD5 哈希值?

4

2 回答 2

1

这是 Postgres 提出的错误。它抱怨你应该索引 md5(giant_string) 或类似的东西(在你的情况下,我想象一个 answer_position 字段),而不是直接使用 Giant_string,因为索引这么大的字符串不是那么有用。

于 2014-04-28T05:43:03.283 回答
0

使用以下代码创建迁移,只需替换表名和字段名即可:

def up
  execute <<~SQL
    CREATE INDEX CONCURRENTLY "index_table_on_field" ON table(MD5(field));
  SQL
end
于 2021-08-03T16:43:39.693 回答