2011-04-11 13 views
104

Bazı PostgreSQL tablo oluşturma bakıyorum ve bu tökezledi: Ben postgres tarafından sağlanan belgeleri okuyun ve OOP nesne tanımlayıcısı kavramını biliyorum ama hala idrak edemeyen SQL, Postgres OID'ler, Nelerdir ve neden yararlıdır?

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

,

  • Böyle bir tanımlayıcı bir veritabanında neden yararlı olabilir?
  • Sorguları kısaltmak için?
  • ne zaman kullanılmalıdır?

cevap

115

OID'ler temel olarak, sistem sütununda (kullanıcı alanı sütununun aksine) bulunan her satır için yerleşik, genel olarak benzersiz bir kimlik verir. Birincil anahtara sahip olmayan, yinelenen satırlarınız vb. Olmayan tablolar için kullanışlıdır. Örneğin, iki aynı satır içeren bir tablonuz varsa ve bu ikisinin en eskiini silmek istiyorsanız, bunu oid sütunu. Tecrübelerime göre

, özelliği (bunlar standart dışı çünkü muhtemelen kısmen) en postgres destekli uygulamalarda genellikle kullanılmayan ve their use is essentially deprecated:

PostgreSQL 8.1 default_with_oids ise

varsayılan olarak kapalıdır olduğunu ; PostgreSQL'in önceki sürümlerinde, varsayılan olarak açıktı.

kullanıcı tablolarındaki OIDler kullanımı

böylece en tesisat bu değişken özürlü bırakmalısınız, onaylanmadı. 'un belirli bir tablo için OID'leri gerektirdiği uygulamalar tablonun tablosunu oluştururken OIDS ile belirtmelidir. Bu değişken, bu davranışına uymayan eski uygulamalarıyla uyumluluk için etkinleştirilmiş olabilir.

+24

oids'in benzersiz olması garanti edilmez. Dokümanlardan: "Büyük veya uzun ömürlü bir veritabanında, tezgahın etrafına sarılması mümkündür. Bu nedenle, OID'lerin benzersiz olduğunu varsaymak kötü bir uygulamadır, çünkü bu durumun geçerli olduğundan emin olun." – radiospiel

+7

Sarma, ayrıca, alt OID'ye sahip olan bir sargı etrafında olabileceği için, yalnızca iki satırın eskilerini yalnızca OID'lerine dayalı olarak silemeyeceğinizi ima eder. –

+0

OID'ler, yukarıdaki yorumlara göre, bu yanıtın yazıldığı 2011 yılında ne de küresel olarak benzersiz değildir. Ayrıca, sistem nesneleri için OID'lere ihtiyaç vardır, bu nedenle, satır sayaçlarındaki tüm OID'leri kullanmak, veritabanına OID'leri yeni tablolara atayarak yardımcı olmaz (çizelgeler için değil, satırları için). Ayrıca, veritabanındaki her tablo için bir tekli 4 baytlık tam sayı sayacı gerçekten yeterli olup olmayacağını düşünün. – FuzzyChef

9

OSB takımından Postgres with için halen kullanımda olan büyük objects (bazı insanlar büyük objeler zaten genellikle yararlı değildir iddia ediyorum rağmen). Ayrıca yaygın olarak system tables tarafından kullanılmaktadır. Örneğin, tüm tabloları tarafından varsayılan olarak kullanılan ayrı bir depolama alanına (saydam olarak) 8KB BYTEA (vb. "Normal" kullanıcı tablolarıyla ilişkili doğrudan kullanımları temel olarak deprecated'dur.

Oid türü, şu anda işaretsiz bir dört baytlık tamsayı olarak uygulanır. Bu nedenle, büyük veritabanlarında, hatta büyük bireysel tablolarda veritabanı çapında teklik sağlamak için yeterince büyük değildir. Bu nedenle, kullanıcı tarafından oluşturulmuş bir tablonun OID sütunu birincil anahtar olarak kullanılması önerilmez. OID'ler en iyi sistem tablolarına yapılan başvurular için kullanılır. o 4B 6 aşarsa

Görünüşe OID dizisi sarmak "yok". Yani özünde, sarılabilecek küresel bir sayaç var. Sarılırsa, bazı yavaşlamalar kullanıldığında ve benzersiz değerler için "aranır" vb.

Eğer bu Linux komut dosyasını kullanabilirsiniz, https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F

2

veritabanı tablolarından bütün OID'lerini kaldırmak için Ayrıca bkz:

PostgreSQL süper kullanıcı olarak Birincisi, giriş:

sudo su postgres 

Şimdi bu komut dosyasını çalıştırın, YOUR_DATABASE_NAME ile veritabanı adı değişti:

Npgsql 3.0 bununla çalışmadığından ve PostgreSQL için önemli olmadığından, tüm komut dosyalarını kaldırmak için bu komut dosyasını kullandım.