是否可以在Postgres目录表pg_largeobject上创建自定义索引?

时间:2019-02-14 04:21:53

标签: postgresql indexing blob

我知道以下事实:大对象存储在称为pg_largeobject的单独表中,该表存储b-tree索引行,而用户表仅存储{{ 1}}。

现在,在仅存储Oid的列上创建索引有点荒谬。因此,我们可以在pg_largeobject表上创建自定义索引以提高数据检索和填充的性能吗?

1 个答案:

答案 0 :(得分:1)

否,您不能这样做,因为pg_largeobject是系统目录。由于对象存储在该处的块中,因此这样做也不会对您有多大帮助。

如果要索引大对象,则说明您做错了什么。大对象太大了,无论如何都无法放入索引条目,谁想像WHERE blob = '...'那样进行搜索?

我怀疑您有一些信息存储在要索引的大对象内 ,例如将状态保留在JSON中,然后将其存储为大对象的(过时的想法)为其属性之一编制索引。

最好将要在大型对象的外部搜索的属性存储为常规表列,这样问题就会消失。

也就是说,在PostgreSQL中,您可以在表达式上定义索引,因此,如果您使用bytea而不是大对象(无论如何,对于较小的二进制数据来说,这是更可取的),则可以在提取内容的表达式上定义索引来自二进制数据的所需属性。您不能对大对象执行此操作,因为访问大对象的功能不是IMMUTABLE,因为大对象的内容可以更改,而oid保持不变。