PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

क्या दृश्य को पूरी तरह से मूर्त रूप देने से पहले किसी दृश्य पर प्रश्नों का उत्तर देना संभव है?

आम तौर पर, पोस्टग्रेज क्वेरी प्लानर करता है संपूर्ण क्वेरी को अनुकूलित करने के लिए "इनलाइन" दृश्य। प्रति दस्तावेज़:

लेकिन मुझे नहीं लगता कि Postgres काफ़ी समझदार हैं यह निष्कर्ष निकालने के लिए कि यह पंक्तियों को विस्फोट किए बिना आधार तालिका से समान परिणाम तक पहुंच सकता है।

आप इस वैकल्पिक क्वेरी को LATERAL . के साथ आज़मा सकते हैं जोड़ना। यह क्लीनर है:

CREATE OR REPLACE VIEW runinfo.v_mt_count_by_day AS
SELECT m.run_id, m.type, m.brand
     , m.start_day + c.rn - 1 AS row_date
     , c.row_count
FROM   runinfo.mt_count_by_day m
LEFT   JOIN LATERAL unnest(m.counts) WITH ORDINALITY c(row_count, rn) ON true;

यह भी स्पष्ट करता है कि (end_day . में से एक) , start_day ) बेमानी है।

LEFT JOIN का उपयोग करना क्योंकि यह क्वेरी प्लानर को आपकी क्वेरी से शामिल होने की उपेक्षा करने की अनुमति दे सकता है:

   SELECT DISTINCT type FROM v_mt_count_by_day;

अन्य (CROSS JOIN के साथ) या INNER JOIN ) यह चाहिए यह देखने के लिए कि क्या पहली तालिका से पंक्तियाँ समाप्त हो गई हैं, शामिल होने का मूल्यांकन करें।

बीटीडब्ल्यू, यह है:

SELECT DISTINCT type ...

नहीं:

SELECT DISTINCT(type) ...

ध्यान दें कि यह एक date लौटाता है अपने मूल में टाइमस्टैम्प के बजाय। आसान, और मुझे लगता है कि वैसे भी आप यही चाहते हैं?

पोस्टग्रेज की आवश्यकता है 9.3+ विवरण:

ROWS FROM पोस्टग्रेज में 9.4+

दोनों स्तंभों को समानांतर सुरक्षित रूप से में विस्फोट करने के लिए :

CREATE OR REPLACE VIEW runinfo.v_mt_count_by_day AS
SELECT m.run_id, m.type, m.brand
       t.row_date::date, t.row_count
FROM   runinfo.mt_count_by_day m
LEFT   JOIN LATERAL ROWS FROM (
          unnest(m.counts)
        , generate_series(m.start_day, m.end_day, interval '1d')
       ) t(row_count, row_date) ON true;

मुख्य लाभ:यदि दो एसआरएफ समान पंक्तियों की संख्या वापस नहीं करते हैं तो यह कार्टेशियन उत्पाद में नहीं उतरेगा। इसके बजाय, NULL मान गद्देदार होंगे।

फिर से, मैं यह नहीं कह सकता कि क्या इससे क्वेरी प्लानर को DISTINCT type के लिए तेज़ योजना में मदद मिलेगी या नहीं परीक्षण के बिना।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रजिस्टर में कुछ भी बदले बिना टीसीपी/आईपी कनेक्शन को पोस्टग्रेएसक्यूएल द्वारा कैसे तोड़ा जाए?

  2. पोस्टग्रेस्क्ल/पीएल/पीजीएसक्यूएल में फंक्शन बनाते समय टपल को समवर्ती रूप से अपडेट किया जाता है

  3. R2DBC और एनम (PostgreSQL)

  4. PostgreSQL में, COPY कमांड के साथ डेटा कैसे डालें?

  5. PostgreSQL - INNER एक LIMIT के साथ दो तालिकाओं में शामिल हों