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



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



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


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




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

  • сделать запросы короче?

  • когда он должен быть использован?

5098   3  

3 ответов:

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

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

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

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

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

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

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

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

удалить все идентификаторы из таблиц базы данных, вы можете использовать этот скрипт в 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.

Comments

    Ничего не найдено.