आप इसे एक साधारण SQL फ़ंक्शन के साथ प्राप्त कर सकते हैं। मुख्य विशेषता फ़ंक्शन है generate_subscripts()
:
CREATE OR REPLACE FUNCTION f_attendance(_arr2d int[])
RETURNS SETOF attendance AS
$func$
SELECT a.*
FROM generate_subscripts($1, 1) i
JOIN attendance a ON a.class = $1[i][1]
AND a.section = $1[i][2]
$func$ LANGUAGE ROWS 10 sql STABLE;
कॉल करें:
SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);
या एक सरणी के साथ समान शाब्दिक - जो कुछ संदर्भों में अधिक सुविधाजनक है, विशेष रूप से तैयार बयानों के साथ:
SELECT * FROM f_attendance('{{1,1},{2,2}}');
समारोह हमेशा एक 2D सरणी की अपेक्षा करता है। यहां तक कि अगर आप एक जोड़ी पास करते हैं, तो उसे घोंसला दें:
SELECT * FROM f_attendance('{{1,1}}');
आपके कार्यान्वयन का ऑडिट
-
आपने फ़ंक्शन को
<ब्लॉककोट>VOLATILE
. बनाया है , लेकिन यहSTABLE
हो सकता है . प्रति दस्तावेज़:इस स्नैपशॉट व्यवहार के कारण, एक फ़ंक्शन जिसमें केवल
SELECT
होता है कमांड को सुरक्षित रूप सेSTABLE
marked चिह्नित किया जा सकता है ।संबंधित:
- किसी पैरामीटर को दिनांक फ़ंक्शन में कैसे पास करें
-
आप
<ब्लॉककोट>LANGUAGE plpgsql
. का भी उपयोग करते हैंsql
. के बजाय , जो समझ में आता है यदि आप एक ही सत्र में कई बार फ़ंक्शन निष्पादित करते हैं। लेकिन फिर आपको इसेSTABLE
भी बनाना होगा या आप उस संभावित प्रदर्शन लाभ को खो देते हैं। मैनुअल एक बार फिर:STABLE
औरIMMUTABLE
फ़ंक्शन कॉलिंग क्वेरी की शुरुआत के रूप में स्थापित स्नैपशॉट का उपयोग करते हैं, जबकि VOLATILE फ़ंक्शन उनके द्वारा निष्पादित प्रत्येक क्वेरी की शुरुआत में एक ताज़ा स्नैपशॉट प्राप्त करते हैं। -
आपका
EXPLAIN
आउटपुट एक केवल अनुक्रमणिका स्कैन . दिखाता है , अनुक्रमिक स्कैन नहीं जैसा कि आपको अपनी टिप्पणी में संदेह है। -
आपके
EXPLAIN
. में एक सॉर्ट स्टेप भी है आउटपुट जो आपके द्वारा दिखाए गए कोड से मेल नहीं खाता। क्या आप वाकई सहीEXPLAIN
. कॉपी किए हैं आउटपुट? वैसे भी आपने इसे कैसे प्राप्त किया? PL/pgSQL फ़ंक्शनEXPLAIN
. के लिए ब्लैक बॉक्स हैं . क्या आपनेauto_explain
. का उपयोग किया था ? विवरण:- pgpsql में लिखे गए UDF आह्वान की क्वेरी योजना पोस्ट करता है
-
पोस्टग्रेस क्वेरी प्लानर को पता नहीं है कि पारित पैरामीटर में कितने सरणी तत्व होंगे, इसलिए क्वेरी की योजना बनाना कठिन है और यह अनुक्रमिक स्कैन (अधिक कारकों के आधार पर) के लिए डिफ़ॉल्ट हो सकता है। आप अपेक्षित संख्या में पंक्तियों की घोषणा करके मदद कर सकते हैं। यदि आपके पास आमतौर पर 10 से अधिक आइटम नहीं हैं तो
ROWS 10
add जोड़ें जैसा मैंने अब ऊपर किया था। और फिर से परीक्षण करें।