एसक्यूएल, पोस्टग्रिड ओआईडीएस, वे क्या हैं और वे क्यों उपयोगी हैं?


161

मैं कुछ PostgreSQL तालिका निर्माण देख रहा हूँ और मैं इस पर ठोकर खाई:

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

मैंने पोस्टग्रेज द्वारा प्रदान किए गए दस्तावेज़ को पढ़ा है और मुझे ओओपी से वस्तु पहचानकर्ता की अवधारणा पता है, लेकिन फिर भी मैं समझ नहीं पाता,

  • ऐसे पहचानकर्ता एक डेटाबेस में क्यों उपयोगी होंगे?
  • प्रश्नों को कम करने के लिए?
  • इसका उपयोग कब किया जाना चाहिए?

मुझे इस समय उद्धृत करने के लिए कोई संदर्भ नहीं मिल सकता है, लेकिन FYI करें मैंने सुना है कि पोस्टग्रेज के सामने के छोर के रूप में Microsoft Access का उपयोग करने के लिए oldसिस्टम कॉलम की उपस्थिति की आवश्यकता होती है
बेसिल बोर्ख

जवाबों:


165

ओआईडी मूल रूप से आपको एक अंतर्निहित, प्रत्येक पंक्ति के लिए विश्व स्तर पर अद्वितीय आईडी देता है, जो सिस्टम कॉलम (उपयोगकर्ता-अंतरिक्ष कॉलम के विपरीत) में निहित है। यह उन तालिकाओं के लिए आसान है जहाँ आपके पास प्राथमिक कुंजी नहीं है, डुप्लिकेट पंक्तियाँ हैं, उदाहरण के लिए, यदि आपके पास दो समान पंक्तियों वाली तालिका है, और आप दो में से सबसे पुरानी हटाना चाहते हैं, तो आप ऐसा कर सकते हैं ओड कॉलम।

मेरे अनुभव में, आम तौर पर अधिकांश पोस्टग्रैड-समर्थित अनुप्रयोगों में सुविधा का उपयोग नहीं किया जाता है (शायद इसलिए कि वे गैर-मानक हैं), और उनका उपयोग अनिवार्य रूप से पदावनत किया गया है :

PostgreSQL 8.1 में default_with_oids डिफ़ॉल्ट रूप से बंद है; PostgreSQL के पूर्व संस्करणों में, यह डिफ़ॉल्ट रूप से चालू था।

उपयोगकर्ता तालिकाओं में OID का उपयोग पदावनत माना जाता है, इसलिए अधिकांश संस्थापनों को इस चर को निष्क्रिय कर देना चाहिए। किसी विशेष तालिका के लिए OID की आवश्यकता वाले एप्लिकेशन को तालिका बनाते समय OIDS के साथ निर्दिष्ट करना चाहिए। यह चर पुराने अनुप्रयोगों के साथ संगतता के लिए सक्षम किया जा सकता है जो इस व्यवहार का पालन नहीं करते हैं।


33
oids अद्वितीय होने की गारंटी नहीं है। डॉक्स से: "एक बड़े या लंबे समय तक रहने वाले डेटाबेस में, काउंटर के चारों ओर लपेटना संभव है। इसलिए, यह मानना ​​बुरा है कि ओआईडी अद्वितीय हैं, जब तक आप यह सुनिश्चित करने के लिए कदम नहीं उठाते कि यह मामला है।"
रेडियोस्पेलेल

8
चारों ओर लपेटने का अर्थ यह भी है कि आप केवल अपने OID के आधार पर दो पंक्तियों के पुराने को हटा नहीं सकते हैं, क्योंकि निम्न OID वाला रैप-अराउंड हो सकता है।
कार्ल जी।

OIDs विश्व स्तर पर अद्वितीय नहीं हैं, ऊपर की टिप्पणियों के अनुसार, और न ही वे 2011 में थे जब यह उत्तर लिखा गया था। इसके अलावा, सिस्टम ऑब्जेक्ट्स के लिए OIDs की आवश्यकता होती है, इसलिए सभी OIDs का उपयोग पंक्ति काउंटरों पर करने से डेटाबेस को OIDs को नई तालिकाओं के लिए असाइन करने में मदद नहीं मिलती है (तालिका के लिए, इसकी पंक्तियाँ नहीं)। इसके अलावा, इस बात पर विचार करें कि क्या एक सिंग 4-बाइट पूर्णांक काउंटर वास्तव में आपके डेटाबेस में प्रत्येक तालिका के लिए पर्याप्त होने वाला है।
फजीचेफ

यह उल्लेख के लायक है, टेबल बनाते समय phpPgAdmin के अधिकांश कार्यान्वयन में, विकल्प को डिफ़ॉल्ट के रूप में अक्षम किया गया है, इस तथ्य के अर्थ में कि यह विकल्प पदावनत है।
vdegenne

3
अगर आपको नहीं पता कि OID का उपयोग किस लिए किया जाता है, तो आप संभवतः उनका उपयोग नहीं करना चाहते हैं।
vdegenne

16

OID अभी भी बड़ी वस्तुओं के साथ पोस्टग्रेज के लिए उपयोग में है (हालांकि कुछ लोग तर्क देंगे कि बड़ी वस्तुएं आम तौर पर वैसे भी उपयोगी नहीं होती हैं)। सिस्टम तालिकाओं द्वारा भी इनका बड़े पैमाने पर उपयोग किया जाता है । वे उदाहरण के लिए TOAST द्वारा उपयोग किए जाते हैं जो 8KB BYTEA (आदि) से बड़े स्टोरेज को एक अलग स्टोरेज एरिया (पारदर्शी रूप से) से स्टोर करता है जो डिफ़ॉल्ट रूप से सभी टेबल द्वारा उपयोग किया जाता है । "सामान्य" उपयोगकर्ता तालिकाओं से जुड़ा उनका प्रत्यक्ष उपयोग मूल रूप से पदावनत है

ओड प्रकार वर्तमान में एक अहस्ताक्षरित चार-बाइट पूर्णांक के रूप में कार्यान्वित किया जाता है। इसलिए, यह बड़े डेटाबेस में, या यहां तक ​​कि बड़े व्यक्तिगत तालिकाओं में डेटाबेस-वाइड विशिष्टता प्रदान करने के लिए पर्याप्त नहीं है। इसलिए, एक प्राथमिक कुंजी के रूप में उपयोगकर्ता द्वारा बनाई गई तालिका के ओआईडी कॉलम का उपयोग करना हतोत्साहित किया जाता है। OID का उपयोग केवल सिस्टम तालिकाओं के संदर्भ में किया जाता है।

जाहिरा तौर पर OID अनुक्रम "लपेटता है" यदि यह 4B 6 से अधिक है । तो संक्षेप में यह एक वैश्विक काउंटर है जो लपेट सकता है। यदि यह लपेटता है, तो कुछ मंदी तब शुरू हो सकती है जब इसका उपयोग किया जाता है और अद्वितीय मूल्यों के लिए "खोज" किया जाता है, आदि।

Https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F भी देखें


9

ओआईडी को चरणबद्ध किया जा रहा है

Postgres के लिए जिम्मेदार कोर टीम धीरे-धीरे OIDs को बाहर कर रही है।

12 पोस्टग्रेट्स OID कॉलम के विशेष व्यवहार को हटा देता है

आपकी तालिका में वैकल्पिक सिस्टम कॉलम के रूप में OID का उपयोग अब Postgres 12 से हटा दिया गया है। आप अब उपयोग नहीं कर सकते हैं:

  • CREATE TABLE … WITH OIDS आदेश
  • default_with_oids (boolean) अनुकूलता सेटिंग

OIDPostgres 12. में डेटा टाइप रहता है। आप स्पष्ट रूप से टाइप का एक कॉलम बना सकते हैं OID

12 पोस्टग्रेज के माइग्रेट करने के बाद , कोई भी वैकल्पिक रूप से परिभाषित सिस्टम कॉलम oid डिफ़ॉल्ट रूप से अदृश्य नहीं रहेगा। प्रदर्शन एक SELECT *अब इस कॉलम शामिल होंगे। ध्यान दें कि यह अतिरिक्त "आश्चर्य" कॉलम भोले ढंग से लिखे गए SQL कोड को तोड़ सकता है।


5

अपने डेटाबेस तालिकाओं से सभी OID को निकालने के लिए, आप इस लिनक्स स्क्रिप्ट का उपयोग कर सकते हैं:

सबसे पहले, PostgreSQL सुपरयुसर के रूप में लॉगिन करें:

sudo su postgres

अब इस स्क्रिप्ट को चलाएं, डेटाबेस नाम के साथ आपका_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

मैंने अपने सभी OID को हटाने के लिए इस स्क्रिप्ट का उपयोग किया, क्योंकि Npgsql 3.0 इसके साथ काम नहीं करता है, और यह अब PostgreSQL के लिए महत्वपूर्ण नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.