Hstore索引行大小最大错误

时间:2014-05-26 15:31:07

标签: ruby-on-rails postgresql ruby-on-rails-4 hstore postgresql-9.3

使用Rails 4并尝试在我的hstore列上执行索引。

我的迁移文件:

class AddIndexToProfiles < ActiveRecord::Migration
  def up
    execute "CREATE INDEX profiles_metadata_gin_data ON profiles USING GIN(meta_data)"
  end

  def down
    execute "DROP INDEX profiles_metadata_gin_data"
  end
end

我收到的错误:

StandardError: An error has occurred, this and all later migrations canceled:

PG::ProgramLimitExceeded: ERROR:  index row size 7936 exceeds maximum 2712 for index "profiles_metadata_gin_data"

知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

不同的索引类型对可以编入索引的项目的大小有各种限制;对于您的GIN索引,看起来您已经超过了“GinMaxItemSize”限制,其定义如下:

#define GinMaxItemSize \
    MAXALIGN_DOWN(((BLCKSZ - SizeOfPageHeaderData - \
            MAXALIGN(sizeof(GinPageOpaqueData))) / 3 - sizeof(ItemIdData)))

我认为您的解决方法选项是:

  • 尝试使用GIST索引,我相信那里的限制应该更高。
  • 重新编译具有更大块大小的Postgres,也许BLCKSZ = 16384可以正常工作。
  • 使用部分GIN索引跳过那些麻烦的大“meta_data”列,例如CREATE INDEX profiles_metadata_gin_data ON profiles USING GIN(meta_data) WHERE length(meta_data::text) < 2000。您必须在查询中包含相同的WHERE子句才能使用索引,这可能比它的价值更麻烦。
  • 找到一种方法来修剪那些麻烦的行的meta_data列,以便您可以在GIN的2712字节限制下发出吱吱声。