SQL, ODG Postgres, что они и зачем они полезны?

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Смотрите также https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F.

Ответ 3

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

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

sudo su postgres

Теперь запустите этот script, изменив 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

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

Ответ 4

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.