<स्ट्राइक>user
स्ट्राइक>
आपके फ़ंक्शन को फिर से लिखते समय मैंने महसूस किया कि आपने यहां कॉलम उपनाम जोड़े हैं:
SELECT
...
auth_user.email AS user,
customers.name AS customer,
.. जो कुछ नहीं करेगा आरंभ करने के लिए, चूंकि वे उपनाम फ़ंक्शन के बाहर अदृश्य हैं और फ़ंक्शन के अंदर संदर्भित नहीं हैं। इसलिए उनकी उपेक्षा की जाएगी। दस्तावेज़ीकरण उद्देश्यों के लिए एक टिप्पणी का बेहतर उपयोग करें।
लेकिन यह आपकी क्वेरी को अमान्य भी बनाता है , क्योंकि user
पूरी तरह से आरक्षित शब्द . है और कॉलम उपनाम के रूप में उपयोग नहीं किया जा सकता जब तक कि डबल-उद्धृत न हो।
अजीब तरह से, मेरे परीक्षणों में फ़ंक्शन अमान्य उपनाम के साथ काम करता प्रतीत होता है। शायद इसलिए कि इसे अनदेखा किया गया है (?) लेकिन मुझे यकीन नहीं है कि इसका कोई साइड इफेक्ट नहीं हो सकता है।
आपका फ़ंक्शन फिर से लिखा गया (अन्यथा समकक्ष):
CREATE OR REPLACE FUNCTION get_web_events_by_userid(int)
RETURNS TABLE(
id int
, time_stamp timestamptz
, description text
, origin text
, userlogin text
, customer text
, client_ip inet
) AS
$func$
SELECT w.id
, w.time_stamp
, w.description
, w.origin
, u.email -- AS user -- make this a comment!
, c.name -- AS customer
, w.client_ip
FROM public.auth_user u
JOIN public.auth_web_events w ON w.user_id_fk = u.id
JOIN public.customers c ON c.id = u.customer_id_fk
WHERE u.id = $1 -- reverted the logic here
ORDER BY w.id DESC
$func$ LANGUAGE sql STABLE;
जाहिर है, STABLE
कीवर्ड ने परिणाम बदल दिया। कार्य अस्थिरता आपके द्वारा वर्णित परीक्षण स्थिति में कोई समस्या नहीं होनी चाहिए। सेटिंग सामान्य रूप से एकल, पृथक फ़ंक्शन कॉल का लाभ नहीं उठाती है। मैनुअल में विवरण पढ़ें। साथ ही, मानक EXPLAIN
अंदर . क्या हो रहा है, इसके लिए क्वेरी प्लान नहीं दिखाता है कार्य। आप अतिरिक्त मॉड्यूल स्वतः-व्याख्या का उपयोग कर सकते हैं उसके लिए:
- pgpsql में लिखे गए UDF आह्वान की क्वेरी योजना पोस्ट करता है
आपके पास बहुत ही अजीब डेटा वितरण . है :
<ब्लॉककोट>auth_web_events तालिका में 100000000 रिकॉर्ड हैं, auth_user->2 रिकॉर्ड, ग्राहक-> 1 रिकॉर्ड
चूंकि आपने अन्यथा परिभाषित नहीं किया है, इसलिए फ़ंक्शन 1000 पंक्तियों का अनुमान लगाता है लौट आया हेागा। लेकिन आपका फ़ंक्शन वास्तव में केवल 2 पंक्तियाँ लौटा रहा है . यदि आपके सभी कॉल केवल 2 पंक्तियों (के आसपास) में लौटते हैं, तो बस एक जोड़े गए ROWS 2
के साथ घोषित करें . VOLATILE
. के लिए क्वेरी योजना बदल सकती है संस्करण भी (भले ही STABLE
वैसे भी यहाँ सही विकल्प है)।