क्वेरी एकीकृत करें
कई स्थानों पर तर्क में सुधार करके, आप पूरे ऑपरेशन को एक ही क्वेरी में एकीकृत कर सकते हैं। SQL फ़ंक्शन में रैप करना वैकल्पिक है:
CREATE OR REPLACE FUNCTION f_elems(_action_id integer)
RETURNS SETOF integer AS
$func$
WITH RECURSIVE l AS (
SELECT a.category_id, l.local_id
FROM action a
JOIN local l USING (local_id)
WHERE a.action_id = $1
UNION ALL
SELECT l.category_id, c.local_id
FROM l
JOIN local c ON c.parent_id = l.local_id -- c for "child"
)
SELECT e.element_id
FROM l
JOIN element e USING (category_id, local_id);
$func$ LANGUAGE sql STABLE;
सभी element_id
को पुनः प्राप्त करता है किसी दिए गए action_id
. के समान और बाल-स्थानीय लोगों के लिए ।
कॉल करें:
SELECT * FROM f_elem(3);
element_id
-----------
6
7
db<>fiddle यहां
OLD sqlfiddle
उप>
यह काफी होना चाहिए कई कारणों से पहले से ही तेज। सबसे स्पष्ट हैं:
- plpgsql में स्लो लूपिंग के लिए शुद्ध SQL को बदलें।
- पुनरावर्ती क्वेरी के शुरुआती सेट को संक्षिप्त करें।
- अनावश्यक और बेहद धीमी गति से निकालें
IN
निर्माण।
मैं SELECT * FROM ...
के साथ कॉल कर रहा हूं केवल SELECT
. के बजाय , भले ही पंक्ति में केवल एक स्तंभ हो, OUT
. का स्तंभ नाम प्राप्त करने के लिए पैरामीटर (element_id
) मैंने फंक्शन हेडर में घोषित किया है।
तेज़, अभी तक
सूचकांक
action.action_id
. पर एक इंडेक्स प्राथमिक कुंजी द्वारा प्रदान किया जाता है।
लेकिन हो सकता है कि आप local.parent_id
पर अनुक्रमणिका से चूक गए हों . इस पर रहते हुए, इसे बहु-स्तंभ अनुक्रमणिका को कवर करना . बनाएं (9.2+ पोस्ट करता है) parent_id
. के साथ पहले तत्व के रूप में और local_id
दूसरे के रूप में। यदि तालिका local
. है तो इससे बहुत मदद मिलेगी बड़ा है। एक छोटी सी टेबल के लिए इतना नहीं या बिल्कुल नहीं:
CREATE INDEX l_mult_idx ON local(parent_id, local_id);
क्यों? देखें:
अंत में, एक मल्टी-कॉलम इंडेक्स
टेबल पर element
कुछ और मदद करनी चाहिए:
CREATE INDEX e_mult_idx ON element (category_id, local_id, element_id);
तीसरा कॉलम element_id
केवल इसे कवरिंग इंडेक्स . बनाने के लिए उपयोगी है . यदि आपकी क्वेरी तालिका element
. से अधिक कॉलम प्राप्त करती है , आप इंडेक्स में और कॉलम जोड़ना चाहेंगे या element_id
. ड्रॉप कर सकते हैं . या तो इसे और तेज़ कर देगा।
भौतिक दृश्य
यदि आपकी तालिकाओं को कुछ या कोई अपडेट प्राप्त नहीं होता है, एक भौतिक दृश्य जो सभी जोड़ियों के पूर्व-गणना सेट को प्रदान करता है (action_id, element_id)
समान श्रेणी साझा करने से यह हल्का-तेज़ हो जाएगा . (action_id, element_id)
Make बनाएं (उस क्रम में) प्राथमिक कुंजी।