programing

SQL, Postgres OIDs, 그것들은 무엇이고 왜 유용합니까?

skycolor 2023. 6. 1. 22:38
반응형

SQL, Postgres OIDs, 그것들은 무엇이고 왜 유용합니까?

나는 Postgre를 보고 있습니다.SQL 테이블을 생성하고 우연히 발견한 것은 다음과 같습니다.

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

저는 포스트그가 제공한 문서를 읽었고 OOP의 객체 식별자 개념을 알고 있지만 여전히 이해하지 못합니다.

  • 왜 그러한 식별자가 데이터베이스에서 유용할까요?
  • 질문을 더 짧게 하기 위해?
  • 언제 사용해야 합니까?

OID는 기본적으로 사용자 공간 열이 아닌 시스템 열에 포함된 모든 행에 대한 기본 제공 ID를 제공합니다.기본 키가 없거나 중복된 행이 있는 테이블 등에 편리합니다.예를 들어, 동일한 행이 두 개 있는 테이블이 있는 경우 둘 중 가장 오래된 행을 삭제하려면 oid 열을 사용하여 삭제할 수 있습니다.

OID는 4바이트 부호 없는 정수를 사용하여 구현됩니다.이들은 고유하지 않습니다. OID 카운터는 2⁄2-1로 둘러 싸여 있습니다.OID는 데이터 유형을 식별하는 데도 사용됩니다( 참조)./usr/include/postgresql/server/catalog/pg_type_d.h).

제 경험에 따르면 이 기능은 대부분의 포스트그레스 지원 애플리케이션에서 일반적으로 사용되지 않으며(일부는 비표준이기 때문일 수 있음), 기본적으로 사용이 권장되지 않습니다.

포스트그레에서이전 버전의 Postgre에서는 SQL 8.1 default_with_oids가 기본적으로 해제되어 있습니다.SQL, 기본적으로 켜져 있습니다.

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

OID가 단계적으로 삭제됨

Postgres를 담당하는 핵심 팀은 OID를 단계적으로 제거하고 있습니다.

Postgres 12는 OID 열의 특수 동작을 제거합니다.

이제 테이블에서 OID를 선택적 시스템 열로 사용하는 것이 Postgres 12에서 제거되었습니다.더 이상 사용할 수 없습니다.

  • CREATE TABLE … WITH OIDS지휘권
  • default_with_oids (boolean)호환성 설정

데이터 유형OID포스트그레스 12에 남아 있습니다.유형의 열을 명시적으로 생성할 수 있습니다.OID.

Postgres 12로 마이그레이션한 후 선택적으로 정의된 시스템 oid기본적으로 더 이상 표시되지 않습니다.수행 중SELECT *이제 이 열이 포함됩니다.이 추가 "깜짝" 열은 새로 작성된 SQL 코드를 손상시킬 수 있습니다.

OID는 여전히 큰 객체가 있는 Postgres에 사용되고 있습니다(어떤 사람들은 어쨌든 큰 객체가 일반적으로 유용하지 않다고 주장하지만).시스템 테이블에서도 광범위하게 사용됩니다.예를 들어, 8KB BYTA(예: BYTEA)보다 큰 데이터를 (투명하게) 별도의 저장 영역에 저장하는 TOST에서 사용됩니다. 이 영역은 기본적으로 모든 테이블에서 사용됩니다."일반" 사용자 테이블과 관련된 직접적인 사용은 기본적으로 권장되지 않습니다.

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

OID 시퀀스가 4B6을 초과하면 "처리"됩니다. 따라서 본질적으로 랩할 수 있는 글로벌 카운터입니다.랩을 사용할 경우 일부 속도 저하가 발생하여 고유한 값을 "검색"하는 등의 작업이 수행될 수 있습니다.

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

데이터베이스 테이블에서 모든 OID를 제거하려면 다음 Linux 스크립트를 사용합니다.

먼저 Postgre로 로그인합니다.SQL 수퍼유저:

sudo su postgres

이제 데이터베이스 이름으로 YOR_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은 이와 함께 작동하지 않으며 Postgre에 중요하지 않기 때문에 이 스크립트를 사용하여 모든 OID를 제거했습니다.더 이상 SQL.

OID를 계속 사용하는 경우에는 OID에 대한 종속성을 제거하는 것이 좋습니다. Postgres의 최신 버전에서는 더 이상 지원되지 않기 때문입니다.예를 들어 버전 10에서 12로의 마이그레이션이 중지될 수 있습니다(문제를 해결할 때까지 일시적으로).

참고 항목: https://dev.to/rafaelbernard/postgresql-pgupgrade-from-10-to-12-566i

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

반응형