如何修复PG :: ProgramLimitExceeded:ERROR?

时间:2014-04-27 21:46:15

标签: ruby-on-rails postgresql indexing ruby-on-rails-4.1

我创建了一个表格答案,并为其添加了以下索引:

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

索引允许通过它的输出和question_id快速查找答案。创建许多答案时,我收到以下错误:

  

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

def up
  execute <<~SQL
    CREATE INDEX CONCURRENTLY "index_table_on_field" ON table(MD5(field));
  SQL
end