Postgres में एक भौतिकवादी दृश्य की परिभाषा को क्वेरी करें


21

मैं सोच रहा हूं कि पोस्टग्रेज में एक भौतिकवादी दृश्य की परिभाषा को कैसे क्वेरी करें। संदर्भ के लिए, मुझे जो करने की उम्मीद थी, वह बहुत कुछ वैसा ही है जैसा आप नियमित रूप से देख सकते हैं:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

जो आपको निम्नलिखित कॉलम देता है:

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into

क्या यह भौतिक विचारों के लिए संभव है?

अब तक के मेरे शोध से, ऐसा प्रतीत होता है कि भौतिक विचारों को जानबूझकर सूचना_केम से बाहर रखा गया है, क्योंकि

Information_schema केवल SQL मानक में मौजूद वस्तुओं को दिखा सकती है।

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

चूँकि वे पूरी तरह से जानकारी_केमे से बाहर होने के लिए दिखाई देते हैं, मुझे यकीन नहीं है कि इस बारे में कैसे जाना है, लेकिन मैं जो करना चाहता हूं वह दुगना है:

  1. प्रश्न करें कि क्या कोई विशेष भौतिक दृष्टिकोण मौजूद है। (अब तक मुझे ऐसा करने का एकमात्र तरीका एक ही नाम से एक चटाई दृश्य बनाने की कोशिश करना है और देखें कि क्या यह ऊपर उड़ रहा है।)
  2. और फिर भौतिकवादी दृश्य की परिभाषा को क्वेरी करें ( view_definitionस्तंभ के समान information_schema.views)।

भौतिक विचारों पर अनूठे अवरोधों के लिए प्रश्न करने के बारे में कुछ सवाल: dba.stackexchange.com/questions/101899
सीन द बीन

अस्तित्व को परखने के लिए आपको तेज तरीके से दिलचस्पी होगी: SELECT to_regclass('some_schema.some_mat_view')- अगर पाया जाता है, तो यह एक एमवी होना जरूरी नहीं है, हालांकि। विवरण: stackoverflow.com/questions/20582500/…
एरविन ब्रान्डसेट्टर

जवाबों:



13

जैसा कि मैंने सोचा था कि यह उतना जटिल नहीं है! (Pg_catalog के थोड़े से ज्ञान के साथ ...)

भाग 1: प्रश्न करें कि क्या एक भौतिक दृष्टिकोण मौजूद है:

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

अच्छा और आसान।

भाग 2: एक भौतिक दृष्टि की परिभाषा को छोड़ें:

चटाई दृश्य की परिभाषा प्राप्त करने के लिए एक क्वेरी के साथ आने के लिए, मुझे पहली बार information_schema.viewsदौड़कर दृश्य की परिभाषा देखनी थी :

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

तब मैं क्वेरी बाहर की नकल की और बदल c.relkind = 'v'::"char"करने के लिए c.relkind = 'm'::"char"आदेश चटाई दृश्य (नियमित रूप से विचारों के बजाय) प्राप्त करने के लिए। यहां देखें पूरी क्वेरी: http://pastebin.com/p60xwfes

इस बिंदु पर आप बहुत आसानी से जोड़ सकते हैं AND c.relname = 'some_mat_view'और इसे चलाने के लिए परिभाषा प्राप्त कर सकते हैं some_mat_view

लेकिन अगली बार जब आप एक चटाई दृश्य की परिभाषा देखना चाहते हैं, तब भी आपको यह सब करना होगा ...

बोनस: इसे आसान बनाने के लिए एक दृश्य बनाएं

मैंने भविष्य में मैट व्यू परिभाषाओं को देखने के लिए आसान बनाने के लिए एक नया दृश्य बनाने का विकल्प चुना। मैं मूल रूप से सिर्फ CREATE VIEW materialized_views ASनए दृश्य बनाने के लिए ऊपर दिए गए क्वेरी की शुरुआत में जोड़ा गया था, और अब मैं इसे इस तरह से क्वेरी कर सकता हूं:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

काफी बेहतर!

मैं इस दृश्य का उपयोग आसानी से क्वेरी करने के लिए कर सकता हूं कि क्या कोई भौतिकीकृत दृश्य बदल *कर मौजूद है count(*) > 0

अस्वीकरण : मुझे नहीं पता कि क्वेरी परिणामों में अन्य कॉलम पूरी तरह से सही हैं, क्योंकि भौतिकवादी विचार मानक विचारों से मौलिक रूप से अलग हैं (मुझे लगता है कि वे सही हैं)। लेकिन इस कम से कम क्वेरी करता है table_schema, table_nameऔर view_definitionसही ढंग से।


0

यहां अन्य उत्तरों के साथ दोष यह है कि आपको सिर्फ एसक्यूएल परिभाषा मिलती है, जबकि ज्यादातर मामलों में आप वास्तविक कॉलम में रुचि रखते हैं, और उन्हें पाठ के रूप में हेरफेर करने में सक्षम होते हैं। इसी तरह के प्रश्न से मेरा उत्तर निम्नलिखित है , जिसमें स्तंभ नाम और डेटाटिप्स शामिल हैं:

मैं यह नहीं कह सकता कि मैं अंतर्निहित डेटा मॉडल को पूरी तरह से समझता हूं, इसलिए नमक के दाने के साथ नीचे दिए गए मेरे समाधान का उपयोग करें:

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name,
    trim(leading '_' from tp.typname) as datatype
from pg_catalog.pg_attribute as attr
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid
where 
    ns.nspname = 'your_schema' and
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0
order by 
    attr.attnum

आप बदलना होगा 'your_schema'और 'your_materialized_view'

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