Programing

SQL, Postgres OID, 무엇이며 왜 유용합니까?

lottogame 2020. 6. 15. 08:17
반응형

SQL, Postgres OID, 무엇이며 왜 유용합니까?


PostgreSQL 테이블 생성을보고 있는데이 문제를 발견했습니다.

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

postgres에서 제공하는 설명서를 읽었으며 OOP의 객체 식별자 개념을 알고 있지만 여전히 파악하지 못합니다.

  • 왜 그러한 식별자가 데이터베이스에서 유용할까요?
  • 검색어를 더 짧게 만들려면?
  • 언제 사용해야합니까?

OID는 기본적으로 시스템 열 (사용자 공간 열이 아닌)에 포함 된 모든 행에 대해 내장 된 전역 고유 ID를 제공합니다. 기본 키가없고 중복 행이있는 테이블에 유용합니다. 예를 들어, 동일한 행이 두 개인 테이블이 있고 가장 오래된 행을 삭제하려는 경우에는 oid column.

내 경험상,이 기능은 일반적으로 대부분의 postgres-backed 응용 프로그램에서 사용되지 않으며 ( 비표준이기 때문에 부분적 으로 사용되지 않음) 기본적으로 더 이상 사용되지 않습니다 .

PostgreSQL 8.1에서 default_with_oids는 기본적으로 꺼져 있습니다. 이전 버전의 PostgreSQL에서는 기본적으로 켜져있었습니다.

사용자 테이블에서 OID 사용은 더 이상 사용되지 않는 것으로 간주되므로 대부분의 설치에서는이 변수를 비활성화해야합니다. 특정 테이블에 OID가 필요한 응용 프로그램은 테이블을 만들 때 WITH OIDS를 지정해야합니다. 이 변수는이 동작을 따르지 않는 이전 응용 프로그램과의 호환성을 위해 활성화 될 수 있습니다.


OID의는 포스트 그레스에 대한 사용 여전히 대형 오브젝트 (어떤 사람들은 큰 개체는 일반적으로 유용 어쨌든없는 주장하지만). 또한 시스템 테이블에서 광범위하게 사용됩니다 . 예를 들어 8KB 이상의 BYTEA (등)를 별도의 저장 영역 (투명하게)에 저장 하는 TOAST에서 사용되며 기본적으로 모든 테이블에서 사용됩니다 . "일반적인"사용자 테이블과 관련된 직접 사용은 기본적으로 더 이상 사용되지 않습니다 .

OID 유형은 현재 부호없는 4 바이트 정수로 구현됩니다. 따라서 큰 데이터베이스 또는 큰 개별 테이블에서 데이터베이스 전체에 고유성을 제공 할만큼 크지 않습니다. 따라서 사용자가 만든 테이블의 OID 열을 기본 키로 사용하지 않는 것이 좋습니다. OID는 시스템 테이블에 대한 참조에만 사용하는 것이 가장 좋습니다.

OID 시퀀스가 ​​4B 6을 초과하면 분명히 랩핑됩니다 . 본질적으로 랩핑 할 수있는 글로벌 카운터입니다. 줄 바꿈하면 고유 값 등을 사용하고 "검색"할 때 약간의 속도 저하가 발생할 수 있습니다.

https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F참조하십시오.


단계적으로 폐지 된 OID

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 코드를 손상시킬 수 있습니다.


데이터베이스 테이블에서 모든 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에는 더 이상 중요하지 않습니다.

참고 URL : https://stackoverflow.com/questions/5625585/sql-postgres-oids-what-are-they-and-why-are-they-useful

반응형