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

विदेशी सर्वर में शामिल होने/दबाने से पहले सबक्वायरी के मूल्यांकन को कैसे बाध्य करें

विदेशी डेटा आवरण

आमतौर पर, सबक्वेरी या सीटीई से जॉइन या कोई व्युत्पन्न तालिका विदेशी सर्वर पर उपलब्ध नहीं होती है और इसे स्थानीय रूप से निष्पादित किया जाना होता है। यानी, साधारण WHERE . के बाद शेष सभी पंक्तियां आपके उदाहरण में क्लॉज को स्थानीय रूप से पुनर्प्राप्त और संसाधित किया जाना है जैसा आपने देखा।

यदि अन्य सभी विफल हो जाते हैं, तो आप उपक्वेरी को निष्पादित कर सकते हैं SELECT id FROM lookup_table WHERE x = 5 और परिणामों को क्वेरी स्ट्रिंग में संयोजित करें।

अधिक आसानी से, आप इसे गतिशील SQL और EXECUTE . के साथ स्वचालित कर सकते हैं पीएल/पीजीएसक्यूएल फ़ंक्शन में। पसंद:

CREATE OR REPLACE FUNCTION my_func(_c1 int, _l_id int)
   RETURNS TABLE(id int, c1 int, c2 int, c3 int) AS
$func$
BEGIN
   RETURN QUERY EXECUTE
     'SELECT id,c1,c2,c3 FROM big_table
      WHERE  c1 = $1
      AND    id = ANY ($2)'
   USING _c1
       , ARRAY(SELECT l.id FROM lookup_table l WHERE l.x = _l_id);
END
$func$  LANGUAGE plpgsql;

संबंधित:

  • तालिका नाम PostgreSQL फ़ंक्शन पैरामीटर के रूप में

या SO पर इस खोज को आजमाएं।

या आप मेटा-कमांड का उपयोग कर सकते हैं \gexec पीएसक्यूएल में। देखें:

  • एसक्यूएल डीडीएल स्टेटमेंट के लिए मौजूदा टेबल से कॉलम नाम फ़िल्टर करें

<स्ट्राइक>या यह काम कर सकता है: (प्रतिक्रिया कहती है काम नहीं करता ।)

<स्ट्राइक>

SELECT id,c1,c2,c3
FROM   big_table
WHERE  c1 = 2
AND    id = ANY (ARRAY(SELECT id FROM lookup_table WHERE x = 5));

स्थानीय रूप से परीक्षण करने पर, मुझे इस तरह की एक क्वेरी योजना मिलती है:

Index Scan using big_table_idx on big_table (cost= ...)
  Index Cond: (id = ANY ($0))
  Filter: (c1 = 2)
  InitPlan 1 (returns $0)
    ->  Seq Scan on lookup_table  (cost= ...)
          Filter: (x = 5)

बोल्ड जोर मेरा।

पैरामीटर $0 योजना में आशा को प्रेरित करता है। उत्पन्न सरणी कुछ ऐसी हो सकती है जिसे पोस्टग्रेज दूरस्थ रूप से उपयोग करने के लिए पास कर सकते हैं। मुझे आपके किसी भी अन्य प्रयास के साथ ऐसी कोई योजना नहीं दिख रही है या कुछ और मैंने स्वयं कोशिश की है। क्या आप अपने fdw के साथ परीक्षण कर सकते हैं?

संबंधित प्रश्न postgres_fdw . से संबंधित है :

  • postgres_fdw:शामिल होने के लिए डेटा को विदेशी सर्वर पर पुश करना संभव है?

एसक्यूएल में सामान्य तकनीक

वह एक अलग कहानी है। बस एक सीटीई का प्रयोग करें। लेकिन मुझे उम्मीद नहीं है कि इससे FDW में मदद मिलेगी।

WITH cte AS (SELECT id FROM lookup_table WHERE x = 5)
SELECT id,c1,c2,c3
FROM   big_table b
JOIN   cte USING (id)
WHERE  b.c1 = 2;

पोस्टग्रेएसक्यूएल 12 परिवर्तित (बेहतर) व्यवहार, ताकि कुछ पूर्वशर्तों को देखते हुए सीटीई को सबक्वेरी की तरह इनलाइन किया जा सके। लेकिन, मैनुअल को उद्धृत करते हुए:

<ब्लॉकक्वॉट>

आप MATERIALIZED . निर्दिष्ट करके उस निर्णय को ओवरराइड कर सकते हैं WITH क्वेरी की अलग गणना के लिए बाध्य करने के लिए

तो:

WITH cte AS MATERIALIZED (SELECT id FROM lookup_table WHERE x = 5)
...

आम तौर पर, इसमें से कोई भी आवश्यक नहीं होना चाहिए यदि आपका डीबी सर्वर ठीक से कॉन्फ़िगर किया गया है और कॉलम आंकड़े अद्यतित हैं। लेकिन असमान डेटा वितरण के साथ कोने के मामले हैं ...




  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 को कैसे परिनियोजित करें

  2. PostgreSQL में एक तिथि से सप्ताह संख्या प्राप्त करें

  3. एडब्ल्यूएस और एज़्योर पर पूरी तरह से प्रबंधित पोस्टग्रेएसक्यूएल होस्टिंग लिगेसी माइग्रेशन के लिए समय पर लॉन्च होती है

  4. PostgreSQL में कई-से-अनेक संबंध कैसे कार्यान्वित करें?

  5. 1,000,000 डेटाबेस परिणामों के साथ API क्लाइंट कैसे प्रदान करें?