हमने कई बार इस बारे में चर्चा की है। सूचना स्कीमा कुछ उद्देश्यों को पूरा करती है। यदि आप सिस्टम कैटलॉग के आसपास अपना रास्ता जानते हैं, तो वे अधिकांश उद्देश्यों को बेहतर तरीके से पूरा करते हैं , आईएमओ। सिस्टम कैटलॉग सभी सूचनाओं का वास्तविक स्रोत है।
जानकारी स्कीमा मानकीकृत बार देखा गया जो पोर्टेबिलिटी, ज्यादातर प्रमुख Postgres संस्करणों में के साथ मदद, क्योंकि अलग आरडीबीएमएस प्लेटफार्मों पर पोर्टेबिलिटी आम तौर पर एक भ्रम है एक बार अपने प्रश्नों प्रणाली कैटलॉग को देखने के लिए जरूरत के लिए परिष्कृत पर्याप्त हैं प्रदान करता है। और, विशेष रूप से, ओरेकल अभी भी जानकारी स्कीमा का समर्थन नहीं करता है।
जानकारी में दृश्य स्कीमा मानक का अनुपालन करने वाले प्रारूप को प्राप्त करने के लिए कई हुप्स के माध्यम से कूदना चाहिए। यह उन्हें धीमा करता है, कभी-कभी बहुत धीमी गति से। इन मूल वस्तुओं के लिए योजनाओं और प्रदर्शन की तुलना करें:
EXPLAIN ANALYZE SELECT * from information_schema.columns;
EXPLAIN ANALYZE SELECT * from pg_catalog.pg_attribute;
अंतर उल्लेखनीय है। यह वास्तव में आप क्या देख रहे हैं पर निर्भर करता है।
आपका उदाहरण
अपने उदाहरण के लिए SELECT * from tbl
, इस सरल तालिका के लिए नीचे दिए गए दो प्रश्नों की तुलना करें:
CREATE TEMP TABLE foo(
A numeric(12,3)
, b timestamp(0)
);
का उपयोग कर pg_attribute
:
SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE attrelid = 'foo'::regclass
AND attnum > 0
AND NOT attisdropped
ORDER BY attnum;
format_type()
सभी संशोधक के साथ पूरा प्रकार लौटाता है:
attname | type
--------+-------------------------------
a | numeric(12,3)
b | timestamp(0) without time zone
यह भी ध्यान दें कि regclass
तालिका के नाम को कलाकारों ने वर्तमान के अनुसार कुछ समझदारी से हल किया है search_path
। यदि नाम मान्य नहीं है तो यह अपवाद भी उठाता है। विवरण:
का उपयोग कर information_schema.columns
:
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'foo'
ORDER BY ordinal_position;
जानकारी मानकीकृत है, लेकिन अधूरी है :
column_name | data_type
------------+----------------------------
a | numeric
b | timestamp without time zone
डेटा प्रकार के लिए पूरी जानकारी प्राप्त करने के लिए आपको इन सभी स्तंभों पर अतिरिक्त रूप से विचार करना होगा:
character_maximum_length
character_octet_length
numeric_precision
numeric_precision_radix
numeric_scale
datetime_precision
interval_type
interval_precision
संबंधित जवाब:
सूची पेशेवरों और विपक्षों , सबसे बड़े पेशेवरों (IMO) को बोल्ड में:
सूचना स्कीमा के विचार
- अक्सर सरल (निर्भर करता है)
- धीमा
- पूर्वनिर्मित, जो आपकी आवश्यकताओं के अनुरूप हो भी सकता है और नहीं भी
- चयनात्मक (उपयोगकर्ता केवल उन वस्तुओं को देखते हैं जिनके लिए उनके पास विशेषाधिकार हैं)
- SQL मानक के अनुरूप (यह कुछ प्रमुख RDBMS द्वारा कार्यान्वित किया गया है)
- ज्यादातर पोर्टेबल प्रमुख पोस्टग्रेज संस्करणों में
- Postgres के बारे में अधिक विशिष्ट ज्ञान की आवश्यकता नहीं है
- पहचानकर्ता वर्णनात्मक, लंबे और कभी-कभी अजीब होते हैं
सिस्टम कैटलॉग
- अक्सर अधिक जटिल (निर्भर करता है), स्रोत के करीब
- तेज
- पूरा (जैसे सिस्टम कॉलम
oid
शामिल)
- SQL मानक के अनुरूप नहीं है
- प्रमुख पोस्टग्रेज संस्करणों में कम पोर्टेबल (लेकिन मूल बातें बदलने वाली नहीं हैं)
- Postgres के बारे में अधिक विशिष्ट ज्ञान की आवश्यकता है
- पहचानकर्ता प्रवण, कम वर्णनात्मक लेकिन सुविधाजनक रूप से कम हैं
मनमानी क्वेरी
किसी क्वेरी से स्तंभ नामों और प्रकारों की समान सूची प्राप्त करने के लिए, आप एक साधारण ट्रिक का उपयोग कर सकते हैं: क्वेरी आउटपुट से एक अस्थायी तालिका बनाएं , फिर ऊपर जैसी तकनीकों का उपयोग करें।
आप LIMIT 0
वास्तविक डेटा की जरूरत नहीं है, आप कर सकते हैं :
CREATE TEMP TABLE tmp123 AS
SELECT 1::numeric, now()
LIMIT 0;
अलग-अलग कॉलम के डेटा प्रकार प्राप्त करने के लिए, आप फ़ंक्शन का उपयोग कर सकते हैं pg_typeof()
:
SELECT pg_typeof(1);