आम तौर पर, पोस्टग्रेज क्वेरी प्लानर करता है संपूर्ण क्वेरी को अनुकूलित करने के लिए "इनलाइन" दृश्य। प्रति दस्तावेज़:
लेकिन मुझे नहीं लगता कि 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
के लिए तेज़ योजना में मदद मिलेगी या नहीं परीक्षण के बिना।