CTE धीमा है क्योंकि इसे बिना बदले (CTE स्कैन के माध्यम से) निष्पादित किया जाना है।
इस प्रकार यह एक अनुकूलन बाधा . है; ऑप्टिमाइज़र के लिए, सीटीई को नष्ट करने की अनुमति नहीं है, भले ही इसके परिणामस्वरूप समान परिणामों के साथ एक बेहतर योजना बने।
सीटीई-समाधान को एक सम्मिलित सबक्वायरी में दोबारा प्रतिक्रिया दी जा सकती है, हालांकि (प्रश्न में अस्थायी तालिका के समान)। पोस्टग्रेज में, एक सम्मिलित सबक्वेरी आजकल 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
);
[अद्यतन:मैं गलत था कि सीटीई को हमेशा-निष्पादित-से-पूर्ण होने की आवश्यकता है, जो केवल डेटा-संशोधित सीटीई के मामले में है]