【问题标题】:How do I fix a PG::ProgramLimitExceeded: ERROR?如何修复 PG::ProgramLimitExceeded: 错误?
【发布时间】:2014-06-13 07:28:16
【问题描述】:

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

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 哈希值?

【问题讨论】:

  • 目前,我只是避免保存任何超过 2700 个字符的记录。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2011-10-13
      • 2018-12-04
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多