यह सच है, जैसा कि नोट किया गया है, कि RETURNING
एक INSERT
. का खंड केवल सम्मिलित पंक्ति देखता है। अधिक विशेष रूप से, मैन्युअल को यहां उद्धृत करना
ए> :
बोल्ड मेरा जोर है।
तो कुछ भी आपको सहसंबंधित सबक्वेरी . जोड़ने से रोकता है RETURNING
. पर सूची:
INSERT INTO employees.password_resets AS ep
(empl_pwd_reset_uuid , empl_user_pvt_uuid , t_valid , for_empl_user_pvt_uuid, token)
SELECT 'f70a0346-a077-11eb-bd1a-aaaaaaaaaaaa', '6efc2b7a-f27e-11ea-b66c-de1c405de048', '2021-04-18 19:57:47.111365', eu.empl_user_pvt_uuid , '19d65aea-7c4a-41bc-b580-9d047f1503e6'
FROM employees.users eu
WHERE empl_user_pub_uuid = 'e2bb39f1f28011eab66c63cb4d9c7a34'
RETURNING for_empl_user_pvt_uuid AS empl_user_pvt_uuid -- alias to meet your org. query
, (SELECT email
FROM employees.emails
WHERE empl_user_pvt_uuid = ep.empl_user_pvt_uuid
ORDER BY t DESC -- NULLS LAST ?
LIMIT 1
) AS email
, (SELECT name_first
FROM employees.profiles
WHERE empl_user_pvt_uuid = ep.empl_user_pvt_uuid
-- ORDER BY ???
LIMIT 1
) AS name_first;
यह बहुत अधिक कुशल . भी है कई कारणों से आपके पास (या क्या प्रस्तावित किया गया था) क्वेरी की तुलना में।
-
हम सबक्वेरी नहीं चलाते
ee
औरep
टेबल की सभी पंक्तियों परemployees.emails
औरemployees.profiles
. यह प्रभावी होगा यदि हमें उन तालिकाओं के प्रमुख भागों की आवश्यकता होती है, लेकिन हम प्रत्येक से केवल एक ही पंक्ति प्राप्त करते हैं। उपयुक्त इंडेक्स के साथ, इसके लिए एक सहसंबंधित सबक्वायरी अधिक कुशल है। देखें: -
हम एक या अधिक सीटीई के ऊपरी हिस्से को नहीं जोड़ते हैं।
-
हम केवल के बाद . अतिरिक्त डेटा प्राप्त करते हैं एक सफल
INSERT
, इसलिए यदि किसी कारण से इंसर्ट नहीं हुआ तो कोई समय बर्बाद नहीं होता है। (शीर्ष पर उद्धरण देखें!)
साथ ही, संभवतः सबसे महत्वपूर्ण, यह सही है . हम उस पंक्ति के डेटा का उपयोग करते हैं जिसे वास्तव में डाला गया है - बाद इसे डालने। (शीर्ष पर उद्धरण देखें!) संभावित डिफ़ॉल्ट मानों के बाद, ट्रिगर या नियम लागू किए गए हैं। हम निश्चित हो सकते हैं कि जो हम देखते हैं वह वास्तव में डेटाबेस में है (वर्तमान में)।
आपके पास कोई ORDER BY
नहीं है profiles.name_first
. के लिए . यह सही नहीं है। या तो केवल एक क्वालिफाइंग पंक्ति है, तो हमें DISTINCT
की आवश्यकता नहीं है न ही LIMIT 1
. या कई हो सकते हैं, तो हमें एक नियतात्मक ORDER BY
. की भी आवश्यकता है नियतात्मक परिणाम प्राप्त करने के लिए।
और अगर emails.t
NULL हो सकता है, आप NULLS LAST
जोड़ना चाहेंगे ORDER BY
. में खंड। देखें:
सूचकांक
आदर्श रूप से, आपके पास ये बहु-स्तंभ अनुक्रमणिकाएँ हैं (इस क्रम में स्तंभों के साथ):
users (empl_user_pub_uuid, empl_user_pvt_uuid)
emails (empl_user_pvt_uuid, email)
profiles (empl_user_pvt_uuid, name_first)
फिर, यदि तालिकाओं को पर्याप्त रूप से वैक्यूम किया जाता है, तो आपको केवल तीन इंडेक्स स्कैन मिलते हैं और पूरा ऑपरेशन तेजी से हल्का हो रहा है।
पूर्व प्राप्त करें-INSERT
मान?
अगर आप वाकई ऐसा चाहते हैं (जो मुझे नहीं लगता कि आप ऐसा करते हैं), तो इस पर विचार करें: