PostgreSQL कॉमन टेबल एक्सप्रेशंस बनाम एक अस्थायी टेबल?


11

साथ पर PostgreSQL प्रलेखन शो निम्न उदाहरण:

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

यह भी नोट करता है:

प्रश्नों के साथ एक उपयोगी संपत्ति यह है कि उनका मूल्यांकन केवल एक बार मूल प्रश्न के निष्पादन के अनुसार किया जाता है, भले ही उन्हें एक बार से अधिक बार माता-पिता क्वेरी द्वारा प्रश्न के साथ भेजा गया हो।

मैं देख रहा हूं कि WITHपुनरावर्ती मूल्यांकन जैसे अन्य चीजों के लिए इस्तेमाल किया जा सकता है। लेकिन ऊपर दिए गए उदाहरण में, क्या WITHअस्थायी तालिकाओं के उपयोग और निर्माण के बीच कोई महत्वपूर्ण अंतर है ?


आप, क्वेरी के निर्माण के लिए एक और स्तंभ जोड़ने के लिए CTE का उपयोग करते हैं SELECTमें WITHसिर्फ नाम लिख कर और फिर से चलाकर है। जबकि अस्थायी तालिका के साथ यह DROPऔर ले जाएगा CREATE। दूसरी ओर यदि आप एक क्वेरी का निर्माण करते हैं और आप बहुत बार स्थैतिक डेटा का पुन: उपयोग करने जा रहे हैं - अनुक्रमणिका के साथ अस्थायी तालिका बनाना निश्चित रूप से सीटीई के लिए फायदेमंद है।
वाओ त्सुण

@VaoTsun अगर किसी क्वेरी के TEMPORARY TABLEसाथ उपयोग किया ON COMMIT DROPजाता है, तो यह केवल क्वेरी को संशोधित करने और फिर से चालू करने का अधिकार है? postgresql.org/docs/9.6/static/sql-createtable.html
नाथन लांग

जवाबों:


16

कुछ सूक्ष्म अंतर हैं, लेकिन कुछ भी कठोर नहीं है:

  • आप एक अस्थायी तालिका पर अनुक्रमित जोड़ सकते हैं;
  • अस्थायी तालमेल सत्र के जीवन के लिए मौजूद हैं (या, यदि ON COMMIT DROP, लेन-देन), WITHतो क्वेरी को कड़ाई से हमेशा स्कोप किया जाता है;
  • यदि कोई क्वेरी किसी फ़ंक्शन / प्रक्रिया को आमंत्रित करती है, तो वह अस्थायी तालिका देख सकती है, लेकिन यह कोई तालिका-भाव नहीं देख सकती है WITH;
  • एक अस्थायी तालिका VACUUMसिस्टम कैटलॉग पर काम उत्पन्न करती है जो WITHनहीं करती है, इसे बनाने / भरने के लिए अतिरिक्त दौर की यात्रा की आवश्यकता होती है, और इसके लिए सर्वर के कैश प्रबंधन में अतिरिक्त कार्य की आवश्यकता होती है, इसलिए यह थोड़ा कम कुशल है।

कुल मिलाकर, आपको WITHटेम्‍प-टेबल पसंद करना चाहिए जब तक कि आपको पता न हो कि आप एक इंडेक्स बनाने से लाभान्वित होंगे।

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


विचारों और अस्थायी विचारों के बारे में क्या?
CMCDragonkai 8

1
Kinda inbetween लेकिन CTE शब्द की तुलना में एक अस्थायी तालिका के करीब। कोई सूचकांक नहीं। सेशन ने स्कूप किया। कार्यों / प्रक्रियाओं के लिए दृश्यमान। कैटलॉग वैक्यूम की जरूरत है।
क्रेग रिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.