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

तालिका की तरह पेड़ से आईडी और वंशज का उपयोग करके दो तालिकाओं में शामिल हों

क्वेरी एकीकृत करें

कई स्थानों पर तर्क में सुधार करके, आप पूरे ऑपरेशन को एक ही क्वेरी में एकीकृत कर सकते हैं। 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 बनाएं (उस क्रम में) प्राथमिक कुंजी।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में अधिकतम (order_field) + 1 लेन-देन के साथ पंक्तियों को कैसे सम्मिलित करें

  2. क्या एडीओ ओडीबीसी ड्राइवरों या केवल ओएलई डीबी प्रदाताओं के साथ काम करता है?

  3. त्रिशंकु क्वेरी समाप्त करें (लेनदेन में निष्क्रिय)

  4. Heroku psql:FATAL:शेष कनेक्शन स्लॉट गैर-प्रतिकृति सुपरयूज़र कनेक्शन के लिए आरक्षित हैं

  5. एक प्ले में IGNORECASE और H2 के लिए अन्य विकल्प सेट करें! फ्रेमवर्क परीक्षण