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

फ़ंक्शन रैपर के बिना क्वेरी की तुलना में SQL फ़ंक्शन बहुत धीमा है

<स्ट्राइक>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 वैसे भी यहाँ सही विकल्प है)।



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

  2. काम करने के लिए सरल पोस्टग्रेएसक्यूएल इंसर्ट नहीं मिल सकता है

  3. एक गतिशील क्रॉसस्टैब क्वेरी निष्पादित करें

  4. पोस्टग्रेएसक्यूएल:नॉट इन बनाम एक्सेप्ट परफॉर्मेंस अंतर (संपादित # 2)

  5. विंडो फ़ंक्शन और अधिक स्थानीय एकत्रीकरण