Patrzę na tworzenie niektórych tabel PostgreSQL i natknąłem się na to:
CREATE TABLE (
...
) WITH ( OIDS = FALSE );
Przeczytałem dokumentację dostarczoną przez postgres i znam koncepcję identyfikatora obiektu z OOP, ale nadal nie rozumiem,
- dlaczego taki identyfikator miałby być przydatny w bazie danych?
- skrócić zapytania?
- kiedy należy go używać?
sql
database
performance
postgresql
fabrizioM
źródło
źródło
old
kolumny systemowej .Odpowiedzi:
Identyfikatory OID w zasadzie dają wbudowany, globalnie unikalny identyfikator dla każdego wiersza, zawarty w kolumnie systemowej (w przeciwieństwie do kolumny przestrzeni użytkownika). Jest to przydatne w przypadku tabel, w których nie masz klucza podstawowego, masz zduplikowane wiersze itp. Na przykład, jeśli masz tabelę z dwoma identycznymi wierszami i chcesz usunąć najstarszy z nich, możesz to zrobić za pomocą kolumna oid.
Z mojego doświadczenia wynika, że ta funkcja jest generalnie nieużywana w większości aplikacji wspieranych przez postgres (prawdopodobnie częściowo dlatego, że są niestandardowe), a ich użycie jest zasadniczo przestarzałe :
źródło
OIDy są nadal używane dla Postgres z dużymi obiektami (chociaż niektórzy ludzie twierdzą, że duże obiekty i tak nie są ogólnie przydatne). Są również szeroko wykorzystywane w tabelach systemowych . Są używane na przykład przez TOAST, który przechowuje większe niż 8KB BYTEA (itp.) W oddzielnym obszarze przechowywania (przezroczystym), który jest używany domyślnie przez wszystkie tabele . Ich bezpośrednie użycie związane z „normalnymi” tabelami użytkowników jest zasadniczo przestarzałe .
Najwyraźniej sekwencja OID „zawija się”, jeśli przekracza 4B 6 . W istocie jest to globalny licznik, który może się zawijać. Jeśli się zawija, może zacząć występować spowolnienie, gdy jest używane i „wyszukiwane” w poszukiwaniu unikalnych wartości itp.
Zobacz także https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F
źródło
Wycofywane identyfikatory OID
Główny zespół odpowiedzialny za Postgres stopniowo wycofuje OID.
Postgres 12 usuwa specjalne zachowanie kolumn OID
Użycie OID jako opcjonalnej kolumny systemowej w tabelach zostało teraz usunięte z Postgres 12. Nie możesz już używać:
CREATE TABLE … WITH OIDS
Komendadefault_with_oids (boolean)
ustawienie zgodnościTyp danych
OID
pozostaje w Postgres 12. Możesz jawnie utworzyć kolumnę tego typuOID
.Po migracji do Postgres 12 żadna opcjonalnie zdefiniowana kolumna systemowa
oid
nie będzie już domyślnie niewidoczna. WykonywanieSELECT *
testamentu obejmuje teraz tę kolumnę. Zauważ, że ta dodatkowa kolumna „niespodzianka” może zepsuć naiwnie napisany kod SQL.źródło
Aby usunąć wszystkie identyfikatory OID z tabel bazy danych, możesz użyć tego skryptu systemu Linux:
Najpierw zaloguj się jako superużytkownik PostgreSQL:
Teraz uruchom ten skrypt, zmieniając YOUR_DATABASE_NAME na nazwę bazy danych:
Użyłem tego skryptu, aby usunąć wszystkie moje identyfikatory OID, ponieważ Npgsql 3.0 z tym nie działa i nie jest już ważne dla PostgreSQL.
źródło