Как исправить ошибку 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