SQL, Postgres OID'leri, Nedir ve neden faydalıdırlar?


161

Bazı PostgreSQL tablo oluşturma bakıyorum ve bu tökezledi:

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

Postgres tarafından sağlanan belgeleri okudum ve OOP'den nesne tanımlayıcı kavramını biliyorum ama yine de kavramıyorum,

  • böyle bir tanımlayıcı neden bir veritabanında yararlı olabilir?
  • sorguları kısaltmak için?
  • ne zaman kullanılmalı?

Şu anda alıntı yapmak için herhangi bir referans bulamıyorum, ancak FYI Postgres için bir ön uç olarak Microsoft Access kullanmanın oldsistem sütununun varlığını gerektirdiğini duydum .
Basil Bourque

Yanıtlar:


165

OID'ler temel olarak, bir sistem sütununda bulunan (kullanıcı alanı sütununun aksine) her satır için yerleşik, global olarak benzersiz bir kimlik verir. Bu, birincil anahtarınızın olmadığı, yinelenen satırların vb. Olduğu tablolar için kullanışlıdır. Örneğin, iki özdeş satıra sahip bir tablonuz varsa ve ikisinin en eskisini silmek istiyorsanız, bunu kullanarak oid sütunu.

Deneyimlerime göre, özellik genellikle postgres destekli uygulamaların çoğunda kullanılmıyor (muhtemelen kısmen standart olmadıkları için) ve kullanımları esasen kullanımdan kaldırıldı :

PostgreSQL 8.1'de default_with_oids varsayılan olarak kapalıdır; PostgreSQL'in önceki sürümlerinde, varsayılan olarak açıktı.

Kullanıcı tablolarında OID'lerin kullanımının kaldırıldığı kabul edilir, bu nedenle çoğu kurulum bu değişkeni devre dışı bırakmalıdır. Belirli bir tablo için OID gerektiren uygulamalar, tablo oluşturulurken WITH OIDS belirtmelidir. Bu değişken, bu davranışı izlemeyen eski uygulamalarla uyumluluk için etkinleştirilebilir.


33
yağların benzersiz olduğu garanti edilmez. Dokümanlardan: "Büyük veya uzun ömürlü bir veritabanında, sayacın etrafa sarılması mümkündür. Bu nedenle, durumun böyle olduğundan emin olmak için adımlar atmadıkça OID'lerin benzersiz olduğunu varsaymak kötü bir uygulamadır."
radiospiel

8
Etraftaki kaydırma, daha düşük OID'ye sahip olan bir sargı olabileceği için, yalnızca iki satırın eskisini yalnızca OID'lerine dayanarak silemeyeceğiniz anlamına gelir.
Carl G

OID'ler, yukarıdaki yorumlara göre küresel olarak benzersiz değildir ve ne de bu cevabın yazıldığı 2011'de değildir. Ayrıca, sistem nesneleri için OID'ler gereklidir, bu nedenle satır sayaçlarındaki tüm OID'lerin kullanılması, veritabanının OID'leri yeni tablolara atamasına yardımcı olmaz (tablo için satırlarına değil). Ayrıca, 4 baytlık tek bir tamsayı sayacının gerçekten veritabanınızdaki her tablo için yeterli olup olmayacağını düşünün.
FuzzyChef

phpPgAdmin uygulamasında bir tablo oluştururken, seçenek varsayılan olarak devre dışı bırak seçeneği işaretlenir, yani bu seçeneğin kullanımdan kaldırıldığı anlamına gelir.
vdegenne

3
hangi OID'lerin kullanıldığını bilmiyorsanız, muhtemelen bunları kullanmak istemezsiniz.
vdegenne

16

OSB kullanıcısının Postgres için halen kullanımda olan ile büyük nesneler (bazı insanlar büyük nesneleri genellikle yararlıdır zaten değildir iddia ediyorum rağmen). Ayrıca sistem tabloları tarafından yaygın olarak kullanılırlar . Örneğin, 8KB BYTEA'dan (vb.) Büyük olanları ayrı ayrı bir depolama alanına (saydam olarak) depolayan TOAST tarafından kullanılır ve bunlar varsayılan olarak tüm tablolar tarafından kullanılır . "Normal" kullanıcı tablolarıyla ilişkili doğrudan kullanımları temelde kullanımdan kaldırılmıştır .

Oid türü şu anda imzasız dört baytlık bir tamsayı olarak uygulanmaktadır. Bu nedenle, büyük veritabanlarında ve hatta büyük ayrı tablolarda veritabanı genelinde benzersizlik sağlayacak kadar büyük değildir. Dolayısıyla, kullanıcı tarafından oluşturulan bir tablonun OID sütununu birincil anahtar olarak kullanmak önerilmez. OID'ler en iyi şekilde yalnızca sistem tablolarına referanslar için kullanılır.

O 4B aşarsa Görünüşe OID dizisi sarmak "yok" 6 . Özünde bu, sarılabilen küresel bir sayaç. Sarılırsa, kullanıldığında ve benzersiz değerler vb. İçin "arandığında" bazı yavaşlamalar meydana gelebilir.

Ayrıca bkz. Https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F


9

OID'ler aşamalı olarak kaldırılıyor

Postgres'den sorumlu çekirdek ekip yavaş yavaş OID'leri aşamalı olarak kaldırıyor.

Postgres 12, OID sütunlarının özel davranışını kaldırır

Tablolarınızda isteğe bağlı bir sistem sütunu olarak OID kullanımı artık Postgres 12'den kaldırılmıştır.

  • CREATE TABLE … WITH OIDS komuta
  • default_with_oids (boolean) uyumluluk ayarı

Veri türü OIDPostgres 12'de kalır. Açıkça türden bir sütun oluşturabilirsiniz OID.

Postgres 12'ye geçtikten sonra , isteğe bağlı olarak tanımlanan sistem sütunları oid artık varsayılan olarak görünmez. Sahne bir SELECT *anda bu sütunu içerecek. Bu ekstra "sürpriz" sütunun, saf yazılmış SQL kodunu kırabileceğini unutmayın.


5

Veritabanı tablolarınızdan tüm OID'leri kaldırmak için şu Linux komut dosyasını kullanabilirsiniz:

İlk olarak, PostgreSQL süper kullanıcısı olarak giriş yapın:

sudo su postgres

Şimdi bu komut dosyasını çalıştırın ve veritabanı adınızla YOUR_DATABASE_NAME değiştirin:

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 bununla çalışmadığından ve PostgreSQL için artık önemli olmadığından bu komut dosyasını tüm OID'leri kaldırmak için kullandım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.