Можно ли создать пользовательский индекс для таблицы каталога Postgres pg_largeobject? - PullRequest
0 голосов
/ 14 февраля 2019

Мне известно о том, что большие объекты хранятся в отдельной таблице с именем pg_largeobject, в которой хранятся b-tree индексированные строки, а в пользовательской таблице просто хранится Oid объекта, хранящегося в pg_largeobject. * 1004.*

Теперь создание индекса для столбца, в котором хранятся только Oid, является абсурдом.Итак, можем ли мы создать пользовательские индексы для таблицы pg_largeobject для повышения производительности поиска данных и прочего?

1 Ответ

0 голосов
/ 14 февраля 2019

Нет, вы не можете этого сделать, потому что pg_largeobject - системный каталог.Это также не принесет вам пользы, так как объекты хранятся там кусками.

Если вы хотите проиндексировать большой объект, вы делаете что-то не так.В любом случае, большой объект был бы слишком большим, чтобы поместиться в элемент указателя, и кто хочет выполнять поиск, например WHERE blob = '...'?

Я подозреваю, что у вас есть некоторая информация, хранящаяся внутри большого объекта, которыйВы хотели бы проиндексировать, как (скрытая) идея сохранения вашего состояния в JSON, сохранения его как большого объекта, а затем индексирования одного из его атрибутов.

Было бы лучше хранить такие атрибуты, которые вы хотитедля поиска вне большого объекта в виде обычных столбцов таблицы проблема исчезнет.

Тем не менее, в PostgreSQL вы можете определять индексы для выражений, поэтому, если вы используете byteaвместо большого объекта (который в любом случае предпочтителен для более мелких двоичных данных) можно определить индекс для выражения, которое извлекает требуемый атрибут из двоичных данных.Вы не можете сделать это с большим объектом, потому что функции для доступа к большим объектам не IMMUTABLE, так как содержимое большого объекта может измениться, в то время как oid остается неизменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...