मुझे विभिन्न तालिकाओं से एकाधिक कॉलम मर्ज करने की आवश्यकता है। मेरा कोड क्वेरी करने के लिए हमेशा के लिए ले रहा है। क्या यह एकाधिक तालिकाओं को मर्ज करने का सही तरीका है? क्या ऐसा करने का एक और अधिक कुशल तरीका है। मैं PostgreSQL 9.6.5 का उपयोग कर रहा हूँ।

SELECT 
  i.id, i.hdm_id, i.tos,
  c.itemid, c.cid, 
  pr.code,
  p.lag

  FROM Table1 i
  JOIN Table2 c ON
  i.id = c.id 

  JOIN Table3 pr ON
  c.id = pr.id

 JOIN Table4 p ON
 pr.id = p.id ;
2
sac 18 अक्टूबर 2017, 09:28

4 जवाब

सबसे बढ़िया उत्तर

मैं आपकी क्वेरी को कवर करने वाले इंडेक्स बनाने की कोशिश करूंगा

create index ix_table1 on table1(id, hdm_id, tos)
create index ix_table2 on table2(id, itemid)
create index ix_table3 on table3(id, code)
create index ix_table4 on table4(id, lag)

आपको इस तरह के प्रश्न की आवश्यकता के बारे में गंभीरता से सोचना चाहिए। क्या आपको वाकई सभी डेटा चाहिए?

1
Radim Bača 18 अक्टूबर 2017, 09:44

आपकी समस्या जॉइन नहीं है। इसमें इंडेक्स भी नहीं हैं (हालांकि वे मदद कर सकते हैं, इसलिए उन पर गौर करें)। आपकी समस्या यह है कि आप अंधाधुंध रूप से 4 तालिकाओं में शामिल हो रहे हैं और उन सभी का चयन कर रहे हैं। प्रत्येक में कितनी पंक्तियाँ हैं, इसके आधार पर निष्पादित होने में कुछ समय लगेगा।

मैं आपको सुझाव दूंगा कि आपको इन तालिकाओं से वास्तव में जो चाहिए, उसे कम करें (जैसे कि आपको WHERE कथन के साथ किस डेटा की आवश्यकता है, जहां उपयुक्त हो)।

आप Postgresql में एक Materialized View भी बना सकते हैं। यह एक सामान्य दृश्य की तरह कार्य करता है, लेकिन क्वेरी के परिणाम रन के बीच में संग्रहीत किए जाते हैं, इसलिए यदि डेटा इस बीच नहीं बदलता है तो इसके कई रन तेज होंगे। इनमें से नकारात्मक पक्ष यह है कि आप उन्हें सीधे अपडेट/डिलीट/सम्मिलित नहीं कर सकते हैं, इसलिए आपको इसे ध्यान में रखना होगा।

1
mag 18 अक्टूबर 2017, 09:44

मैं निम्नलिखित चीजों का सुझाव दूंगा:

1) अनुक्रमणिका विखंडन की जाँच करें और यहाँ बताए गए चरणों का पालन करें - https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes

2) जॉइन का उपयोग करते समय, आपको तालिकाओं के क्रम पर भी विचार करना चाहिए। जिस भी तालिका में रिकॉर्ड की संख्या कम है, पहले उसका उपयोग करें। तो अगले बाद में शामिल होने से फ़िल्टर करने के लिए रिकॉर्ड की संख्या कम होगी।

3) उपयुक्त अनुक्रमणिका का उपयोग करें यदि तालिका में कोई है (इस मामले में आईडी के अलावा)।

उम्मीद है ये मदद करेगा।

सादर, जॉनी

0
Jony shah 18 अक्टूबर 2017, 09:47

क्या आपने तालिका 1 की i.id को दूसरी तालिका i.id में सीधे शामिल करने का प्रयास किया है? आप कुछ अलग कर रहे हैं। आप Table1.id से table2.id में शामिल हों। फिर Table2.id से Table3.id तक। फिर Table3.id से Table4.id तक। तालिका 1 में सीधे शामिल होने का प्रयास करें:

SELECT 
  i.id, i.hdm_id, i.tos,
  c.itemid, c.cid, 
  pr.code,
  p.lag

  FROM Table1 i
  JOIN Table2 c ON
  i.id = c.id 

  JOIN Table3 pr ON
  i.id = pr.id

  JOIN Table4 p ON
  i.id = p.id ;
0
Zorkolot 19 अक्टूबर 2017, 22:38