SQL, OIDs Postgres, что они и чем они полезны? - PullRequest
141 голосов
/ 11 апреля 2011

Я смотрю на создание таблиц в PostgreSQL и наткнулся на это:

CREATE TABLE (
...
) WITH ( OIDS = FALSE );

Я прочитал документацию, предоставленную postgres, и я знаю концепцию идентификатора объекта из ООП, но все же не понимаю,

  • почему такой идентификатор будет полезен в базе данных?
  • , чтобы сделать запросы короче?
  • когда его следует использовать?

Ответы [ 4 ]

145 голосов
/ 12 апреля 2011

OID в основном предоставляют встроенный глобальный уникальный идентификатор для каждой строки, содержащейся в системном столбце (в отличие от столбца пользовательского пространства).Это удобно для таблиц, в которых у вас нет первичного ключа, есть повторяющиеся строки и т. Д. Например, если у вас есть таблица с двумя одинаковыми строками и вы хотите удалить самую старую из двух, вы можете сделать это, используяoid column.

По моему опыту, эта функция обычно не используется в большинстве приложений с постгрес-поддержкой (вероятно, частично потому, что они нестандартны), и их использование по существу устарело

В PostgreSQL 8.1 default_with_oids по умолчанию отключено;в предыдущих версиях PostgreSQL он был включен по умолчанию.

Использование OID в пользовательских таблицах считается устаревшим, поэтому в большинстве установок эта переменная должна быть отключена.Приложения, которым требуются идентификаторы OID для конкретной таблицы, должны указывать WITH OIDS при создании таблицы.Эта переменная может быть включена для совместимости со старыми приложениями, которые не следуют этому поведению.

13 голосов
/ 30 января 2015

OID все еще используются для Postgres с большими объектами (хотя некоторые люди утверждают, что большие объекты в общем случае бесполезны). Они также широко используются системными таблицами . Они используются, например, TOAST , который хранит BYTEA размером более 8 КБ (и т. Д.) В отдельной области хранения (прозрачно), которая используется по умолчанию для всех таблиц . Их прямое использование, связанное с «обычными» пользовательскими таблицами, в основном устарело .

Тип oid в настоящее время реализован как беззнаковое четырехбайтовое целое число. Поэтому его недостаточно для обеспечения уникальности всей базы данных в больших базах данных или даже в больших отдельных таблицах. Поэтому использование столбца OID созданной пользователем таблицы в качестве первичного ключа не рекомендуется. OID лучше всего использовать только для ссылок на системные таблицы.

Очевидно, что последовательность OID «оборачивается», если она превышает 4B 6 . Так что по сути это глобальный счетчик, который может оборачиваться. Если это произойдет, может начаться некоторое замедление при использовании и «поиске» уникальных значений и т. Д.

См. Также https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F

2 голосов
/ 11 августа 2015

Чтобы удалить все OID из таблиц базы данных, вы можете использовать этот скрипт Linux:

Сначала войдите в систему как суперпользователь PostgreSQL:

sudo su postgres

Теперь запустите этот скрипт, изменив YOUR_DATABASE_NAME вместе с вамиимя базы данных:

for tbl in `psql -qAt -c "select schemaname || '.' || tablename from pg_tables WHERE schemaname <> 'pg_catalog' AND schemaname <> 'information_schema';" YOUR_DATABASE_NAME` ; do  psql -c "alter table $tbl SET WITHOUT OIDS" YOUR_DATABASE_NAME ; done

Я использовал этот сценарий для удаления всех моих OID, поскольку Npgsql 3.0 не работает с этим и больше не важен для PostgreSQL.

1 голос
/ 13 июля 2019

OIDs постепенно исключаются

Основная группа, ответственная за Postgres, постепенно выводит OID из строя.

Postgres 12 удаляет специальное поведение столбцов OID

Использование OIDдополнительный столбец системы в ваших таблицах теперь удален из Postgres 12. Вы больше не можете использовать:

  • CREATE TABLE … WITH OIDS команда
  • default_with_oids (boolean) настройка совместимости

Тип данных OID остается в Postgres 12. Вы можете явно создать столбец типа OID.

После миграции на Postgres 12 любой необязательный системный столбец oid больше не будет невидимым по умолчанию.Выполнение SELECT * теперь будет включать этот столбец.Обратите внимание, что этот дополнительный «неожиданный» столбец может нарушить наивно написанный код SQL.

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