Как исправить ошибку PG::ProgramLimitExceeded: ERROR?

Я создал таблицу ответов и добавил к ней следующий индекс:

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 ответа

Это ошибка, поднятая Postgres. Он жалуется на то, что вы должны индексировать md5(iant_string) или что-то в том же духе (в вашем случае я представляю поле answer_position), а не напрямую, например,iant_string, потому что индексирование больших строк не очень полезно.

Создайте миграцию с помощью следующего кода, просто замените имена таблиц и полей:

      def up
  execute <<~SQL
    CREATE INDEX CONCURRENTLY "index_table_on_field" ON table(MD5(field));
  SQL
end
Другие вопросы по тегам