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

पोस्टग्रेज नॉट इन परफॉरमेंस

एक विशाल IN सूची बहुत अक्षम है। पोस्टग्रेएसक्यूएल को आदर्श रूप से इसकी पहचान करनी चाहिए और इसे एक ऐसे संबंध में बदलना चाहिए जो यह एक एंटी-जॉइन करता है, लेकिन इस बिंदु पर क्वेरी प्लानर को यह नहीं पता कि यह कैसे करना है, और इस मामले की पहचान करने के लिए आवश्यक नियोजन समय में हर क्वेरी का खर्च आएगा। NOT IN का उपयोग करता है समझदारी से, इसलिए इसे बहुत कम लागत वाली जांच करनी होगी। देखें इस विषय पर पहले का यह और अधिक विस्तृत उत्तर

जैसा कि डेविड एल्ड्रिज ने लिखा है, इसे एक एंटी-जॉइन में बदलकर सबसे अच्छा हल किया जाता है। मैं इसे VALUES . पर शामिल होने के रूप में लिखूंगा केवल इसलिए सूचीबद्ध करें क्योंकि PostgreSQL VALUES . को पार्स करने में बेहद तेज़ है संबंधों में सूचीबद्ध है, लेकिन प्रभाव एक ही है:

SELECT entityid 
FROM entity e
LEFT JOIN level1entity l1 ON l.level1id = e.level1_level1id
LEFT JOIN level2entity l2 ON l2.level2id = l1.level2_level2id
LEFT OUTER JOIN (
    VALUES
    (1377776),(1377792),(1377793),(1377794),(1377795),(1377796)
) ex(ex_entityid) ON (entityid = ex_entityid)
WHERE l2.userid = 'a987c246-65e5-48f6-9d2d-a7bcb6284c8f' 
AND ex_entityid IS NULL; 

मूल्यों के पर्याप्त बड़े सेट के लिए आप एक अस्थायी तालिका बनाने से भी बेहतर हो सकते हैं, COPY इसमें मान डालें, एक PRIMARY KEY creating बनाना उस पर, और उस पर शामिल होना।

यहां और संभावनाएं तलाशी गईं:

https://stackoverflow.com/a/17038097/398670



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL WHERE क्लॉज में कॉलम उपनाम स्वीकार नहीं करता है

  2. रेल 4.2.0 में सरल पूर्णांक असाइनमेंट के लिए रेंज एरर जिसे सत्यापन द्वारा पकड़ा जाना चाहिए

  3. PostgreSQL में एकाधिक कॉलम के लिए प्राथमिक कुंजी?

  4. PostgreSQL में कल की तारीख कैसे प्राप्त करें

  5. जब स्थिति (पुरानी) हो तो ट्रिगर डालें या अपडेट करें