SQL, Postgres OIDs, что это такое и почему они полезны?
Я смотрю на создание таблицы PostgreSQL и я наткнулся на это:
CREATE TABLE (
...
) WITH ( OIDS = FALSE );
Я прочитал документацию, предоставленную postgres, и я знаю концепцию идентификатора объекта из ООП, но все же я не понимаю,
- почему такой идентификатор был бы полезен в базе данных?
- сделать запросы короче?
- когда он должен быть использован?
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