답변:
OID는 기본적으로 사용자 열과 달리 시스템 열에 포함 된 모든 행에 대해 내장 된 전역 고유 ID를 제공합니다. 기본 키가없고 중복 행이있는 테이블에 유용합니다. 예를 들어, 동일한 행이 두 개인 테이블이 있고 가장 오래된 행을 삭제하려는 경우에는 oid column.
필자의 경험에 따르면,이 기능은 일반적으로 대부분의 postgres-backed 응용 프로그램에서 사용되지 않으며 ( 비표준이기 때문에 부분적으로) 사용이 본질적으로 더 이상 사용되지 않습니다 .
PostgreSQL 8.1에서 default_with_oids는 기본적으로 꺼져 있습니다. 이전 버전의 PostgreSQL에서는 기본적으로 켜져있었습니다.
사용자 테이블에서 OID 사용은 더 이상 사용되지 않는 것으로 간주되므로 대부분의 설치에서는이 변수를 비활성화해야합니다. 특정 테이블에 OID가 필요한 응용 프로그램은 테이블을 만들 때 WITH OIDS를 지정해야합니다. 이 변수는이 동작을 따르지 않는 이전 응용 프로그램과의 호환성을 위해 활성화 될 수 있습니다.
OID는 여전히 큰 물체를 가진 Postgres에 사용되고 있습니다 (어떤 사람들은 큰 물체는 일반적으로 유용하지 않다고 주장하지만). 또한 시스템 테이블에서 광범위하게 사용됩니다 . 예를 들어 8KB 이상의 BYTEA (등)를 별도의 저장 영역 (투명하게)에 저장 하는 TOAST에서 사용되며 기본적으로 모든 테이블에서 사용됩니다 . "일반적인"사용자 테이블과 관련된 직접 사용은 기본적으로 더 이상 사용되지 않습니다 .
OID 유형은 현재 부호없는 4 바이트 정수로 구현됩니다. 따라서 큰 데이터베이스 또는 큰 개별 테이블에서 데이터베이스 전체에 고유성을 제공 할만큼 크지 않습니다. 따라서 사용자가 만든 테이블의 OID 열을 기본 키로 사용하지 않는 것이 좋습니다. OID는 시스템 테이블에 대한 참조에만 사용하는 것이 가장 좋습니다.
OID 시퀀스가 4B 6을 초과하면 분명히 랩핑됩니다 . 본질적으로 랩핑 할 수있는 글로벌 카운터입니다. 줄 바꿈하면 고유 값 등을 사용하고 "검색"할 때 약간의 속도 저하가 발생할 수 있습니다.
https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F 도 참조하십시오.
Postgres를 담당하는 핵심 팀은 점차 OID를 단계적으로 폐지하고 있습니다.
이제 테이블에서 OID를 선택적 시스템 열로 사용하는 것이 Postgres 12에서 제거되었습니다. 더 이상 다음을 사용할 수 없습니다.
CREATE TABLE … WITH OIDS
명령default_with_oids (boolean)
호환성 설정데이터 유형 OID
은 Postgres 12에 남아 있습니다 OID
. 유형의 열을 명시 적으로 만들 수 있습니다 .
Postgres 12로 마이그레이션 한 후 선택적으로 정의 된 시스템 열 oid
은 더 이상 기본적으로 표시되지 않습니다. 를 수행 SELECT *
하면 이제이 열이 포함됩니다. 이 추가 "놀람"열은 순전히 작성된 SQL 코드를 손상시킬 수 있습니다.
데이터베이스 테이블에서 모든 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
Npgsql 3.0이 작동하지 않기 때문에이 스크립트를 사용하여 모든 OID를 제거했으며 더 이상 PostgreSQL에 중요하지 않습니다.
old
시스템 열이 있어야한다고 들었습니다 .