एक विशाल 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