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

106

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

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

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

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

3 ответа

108
Лучший ответ

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

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

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

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

  • 26
    oids не гарантируется быть уникальным. Из документов: «В большой или долгоживущей базе данных счетчик может обернуться. Следовательно, считается плохой практикой предполагать, что идентификаторы OID уникальны, если только вы не предпримете шаги, чтобы убедиться, что это так».
  • 7
    Обтекание также подразумевает, что вы не обязательно можете удалить более старую из двух строк, основываясь только на их OID, поскольку та, которая имеет более низкий OID, могла быть обтеканием.
Показать ещё 3 комментария
9

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

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

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

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

2

Чтобы удалить все 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню