निम्नलिखित कथन की क्वेरी को अनुकूलित करने के लिए एक अनुक्रमणिका जोड़ें:

SELECT SUPPLIER.COMPANY_NAME, SUPPLIER.CITY
FROM PRODUCT JOIN SUPPLIER
ON PRODUCT.SUPPLIER_NAME = SUPPLIER.COMPANY_NAME;

मैंने जो बयान लिखा है वह इस प्रकार है:

EXPLAIN PLAN FOR SELECT PRODUCT.SUPPLIER_NAME, SUPPLIER.COMPANY_NAME FROM PRODUCT,SUPPLIER;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
CREATE INDEX PS_IDX_SC ON PRODUCT,SUPPLIER(PRODUCT.) ;
EXPLAIN PLAN FOR SELECT PRODUCT.SUPPLIER_NAME, SUPPLIER.COMPANY_NAME FROM PRODUCT JOIN SUPPLIER;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
DROP INDEX PS_IDX_SC;

लाइन 45 पर स्टेटमेंट कैसे लिखें, धन्यवाद।

reference

0
user13862969 4 जुलाई 2020, 09:02

2 जवाब

आप इंडेक्स को दो टेबल पर नहीं बना सकते हैं।

आपको निम्नानुसार दो अलग-अलग अनुक्रमणिका बनाने की आवश्यकता है:

CREATE INDEX PS_IDX_PS ON PRODUCT(SUPPLIER_NAME) ; 

CREATE INDEX PS_IDX_SC ON SUPPLIER(COMPANY_NAME) ; 
1
Tejash 4 जुलाई 2020, 09:32
धन्यवाद, मैं ओरेकल सीख रहा हूं और मुझे मिलने वाले कई प्रश्न हैं।
 – 
user13862969
4 जुलाई 2020, 10:13
इसे आज़माएं और यदि यह इसके लिए काम करता है तो आपको उत्तर स्वीकार करना चाहिए ताकि आपका प्रश्न हल हो गया हो।
 – 
Tejash
4 जुलाई 2020, 10:59

आइए मैं आपके प्रश्न का उत्तर अलग तरीके से देने का प्रयास करता हूं, आपको एक संक्षिप्त अवलोकन देने का प्रयास करता हूं कि अनुक्रमणिका क्या हैं, और कभी-कभी वे उत्तर नहीं होते हैं। आप एक शर्त के आधार पर दो तालिकाओं में शामिल हो रहे हैं, लेकिन फ़िल्टर किए बिना। जब आपको किसी प्रदर्शन समस्या का विश्लेषण करने की आवश्यकता हो, और आपको लगता है कि एक अनुक्रमणिका ही इसका उत्तर है, तो थोड़ा और सोचने का प्रयास करें।

आपके विशिष्ट मामले में, जॉइन का कोई फ़िल्टर नहीं है, इसलिए आप आपूर्तिकर्ता का नाम और कंपनी का नाम दिखाते हैं। लेकिन आपकी क्वेरी केवल दो कॉलम दिखाती है: उत्पाद तालिका से आपूर्तिकर्ता_नाम, और आपूर्तिकर्ता तालिका से company_name। हालाँकि, यहाँ शामिल होने की स्थिति क्या है? मुझे लगता है कि company_name और सप्लायर_नाम समान हैं, हालांकि, अगर आप मुझसे पूछें तो दोनों टेबलों से एक ही कॉलम को पुनः प्राप्त करने का कोई मतलब नहीं है।

मूल क्वेरी

SQL> SELECT PRODUCT.SUPPLIER_NAME, SUPPLIER.COMPANY_NAME FROM PRODUCT JOIN SUPPLIER;

क्वेरी फिर से लिखें

SQL> SELECT PRODUCT.SUPPLIER_NAME, SUPPLIER.COMPANY_NAME FROM PRODUCT JOIN SUPPLIER 
     on PRODUCT.SUPPLIER_NAME = SUPPLIER.COMPANY_NAME;

हमेशा शामिल होने की स्थिति लिखने का प्रयास करें, क्वेरी को और अधिक पठनीय बनाता है। आपके मामले में आप दोनों तालिकाओं में दो अनुक्रमणिका बना सकते हैं, जैसा कि @Tejash ने आपको पहले दिखाया है, लेकिन मैं आपको कुछ और समझाता हूं।

  • यदि आपकी SQL क्वेरी केवल अनुक्रमणिका में मौजूद स्तंभों को पुनः प्राप्त करती है, तो Oracle संभवतः डेटा तक पहुँचने के लिए अनुक्रमणिका का उपयोग करेगा। इस मामले में, इंडेक्स द्वारा एक्सेस करना टेबल की तुलना में तेज होगा क्योंकि इंडेक्स टेबल से छोटे होते हैं।
  • हालाँकि, यदि आपकी SQL क्वेरी अनुक्रमणिका में निहित स्तंभों की तुलना में अधिक स्तंभ प्राप्त करती है (उदाहरण के लिए, product_name), तो यह देखना बहुत दिलचस्प होगा कि क्या अनुक्रमणिका से क्वेरी तेज़ होती है जब आपके पास उस पर कोई फ़िल्टर नहीं होता है। इस मामले में Oracle शायद INDEX ROWID द्वारा TABLE ACCESS नामक एक विधि का उपयोग करेगा। इसका मतलब है कि ओरेकल पंक्तिबद्ध को पुनः प्राप्त करने के लिए सूचकांक का उपयोग करता है, फिर यह सूचकांक से पुनर्प्राप्त पंक्ति का उपयोग करके डेटा प्राप्त करने के लिए तालिका में जाता है। इस मामले में, जब अधिक कॉलम शामिल होते हैं, यदि टेबल काफी बड़ी हैं, तो मैं शर्त लगाता हूं कि टेबल फुल स्कैन द्वारा एक्सेस करना इंडेक्स द्वारा एक्सेस करने से तेज है।

मेरी सलाह: DBMS_STATS का उपयोग करके दोनों तालिकाओं के आंकड़े प्राप्त करें। और, यदि आपके पास Oracle 11g या उच्चतर है, जो आप शायद सबसे अधिक करते हैं, तो आप अदृश्य अनुक्रमणिका का उपयोग उन प्रश्नों के प्रदर्शन को सत्यापित करने के लिए कर सकते हैं जब आप अपने परिवेश को प्रभावित किए बिना अनुक्रमणिका जोड़ते हैं, तो जब आप सुनिश्चित हैं, आप उन्हें दृश्यमान बना सकते हैं।

SQL> CREATE INDEX IDX_PRO_SUP ON PRODUCT(SUPPLIER_NAME) INVISIBLE;

SQL> CREATE INDEX IDX_SUP_COM SUPPLIER(COMPANY_NAME) INVISIBLE; 

यह देखने के लिए कि आपके स्वयं के सत्र में अनुक्रमणिका आपकी व्याख्या योजना के साथ कैसे काम करेगी।

SQL> ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES=TRUE;
SQL> EXPLAIN PLAN FOR SELECT PRODUCT.SUPPLIER_NAME, SUPPLIER.COMPANY_NAME FROM 
     PRODUCT,SUPPLIER;
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

फिर जब आप सुनिश्चित हों कि वे अनुक्रमणिका आपकी अपेक्षा के अनुरूप काम करती हैं:

SQL> ALTER INDEX IDX_PRO_SUP VISIBLE;

SQL> ALTER INDEX IDX_SUP_COM VISIBLE;

आशा है कि इससे सहायता मिलेगी। सादर

0
Roberto Hernandez 4 जुलाई 2020, 11:25
धन्यवाद और मुझे आपके उत्तर को बेहतर ढंग से समझने के लिए कुछ समय देना होगा और फिर मैं आपसे और प्रश्न पूछूंगा।
 – 
user13862969
4 जुलाई 2020, 11:55
कोई बात नहीं। यही वह समुदाय है जिसके लिए :)
 – 
Roberto Hernandez
4 जुलाई 2020, 11:58