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

Postgres . में अस्थायी तालिका का उपयोग करने की तुलना में CTE धीमे का उपयोग करके हटाएं

CTE धीमा है क्योंकि इसे बिना बदले (CTE स्कैन के माध्यम से) निष्पादित किया जाना है।

TFM (अनुभाग 7.8.2) कहता है: WITH में डेटा-संशोधित विवरण निष्पादित किए जाते हैं बिल्कुल एक बार, और हमेशा पूरा करने के लिए, स्वतंत्र रूप से चाहे प्राथमिक क्वेरी उनके आउटपुट के सभी (या वास्तव में कोई भी) पढ़ती है। ध्यान दें कि यह चयन के साथ नियम से अलग है:जैसा कि पिछले खंड में बताया गया है, एक चयन का निष्पादन है केवल तब तक ले जाया जाता है जब तक प्राथमिक क्वेरी इसके आउटपुट की मांग करती है।

इस प्रकार यह एक अनुकूलन बाधा . है; ऑप्टिमाइज़र के लिए, सीटीई को नष्ट करने की अनुमति नहीं है, भले ही इसके परिणामस्वरूप समान परिणामों के साथ एक बेहतर योजना बने।

सीटीई-समाधान को एक सम्मिलित सबक्वायरी में दोबारा प्रतिक्रिया दी जा सकती है, हालांकि (प्रश्न में अस्थायी तालिका के समान)। पोस्टग्रेज में, एक सम्मिलित सबक्वेरी आजकल EXISTS() संस्करण की तुलना में तेज़ है।

DELETE FROM customer del
USING ( SELECT id
        , row_number() over(partition by uuid order by created_date desc)
                 as rn
        FROM customer
        ) sub
WHERE sub.id = del.id
AND sub.rn > 1
        ;

दूसरा तरीका है TEMP VIEW . का उपयोग करना . यह वाक्यविन्यास रूप से है temp table . के बराबर मामला, लेकिन अर्थात् सम्मिलित सबक्वेरी फॉर्म के बराबर (वे बिल्कुल . प्राप्त करते हैं एक ही प्रश्न योजना, कम से कम इस मामले में)। ऐसा इसलिए है क्योंकि पोस्टग्रेज का ऑप्टिमाइज़र डिसमन्ट करता है देखें और इसे मुख्य क्वेरी के साथ जोड़ दें (पुल-अप ) आप एक view देख सकते हैं PG में एक प्रकार के मैक्रो के रूप में।

CREATE TEMP VIEW targets
AS SELECT id
        , row_number() over(partition by uuid ORDER BY created_date DESC) AS rn
FROM customer;

EXPLAIN
DELETE FROM customer
WHERE id IN ( SELECT id
            FROM targets
            WHERE rn > 1
        );

[अद्यतन:मैं गलत था कि सीटीई को हमेशा-निष्पादित-से-पूर्ण होने की आवश्यकता है, जो केवल डेटा-संशोधित सीटीई के मामले में है]



  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 पंक्ति मूल्यों की तुलना करने के लिए?

  2. एक कॉलम में सरणी या एकाधिक मान कैसे स्टोर करें

  3. pghoard विकल्प - क्लस्टरकंट्रोल के साथ PostgreSQL बैकअप प्रबंधन

  4. नेस्टेड वस्तु पर jsonb क्वेरी पोस्टग्रेज करता है

  5. SUM के साथ LEFT JOIN को पोस्टग्रेज करता है, लापता रिकॉर्ड